C++ Matrix in objective-c

C++ Matrix in objective-c

本文关键字:objective-c in Matrix C++      更新时间:2023-10-16

我正在尝试编写一个类来操作Objective-c中的矩阵,最初我使用的是NSArrays和NSNumbers,但是这导致我正在做的事情的代码非常慢(模拟双摆),所以我决定尝试将我的数组重写为c ++数组,但是我遇到了我不知道如何解决的问题。

运行此代码会给我一个错误-[SMFiniteDifferenceHelper matrixHandler]: unrecognized selector sent to instance 0x100107cb0即使我的方法在头文件中并在类中实现。但是,如果我只保留未设置的array[][]值之一,则代码运行良好...

休息

self.matrixHandler = [[SMMatrixHandler alloc] init];
        double **array1 = (double **)malloc(3*2*sizeof(double)); // height
        for (int i = 0; i < 3; ++i)
            array1[i] = new double[2]; // width
        array1[0][0] = 1.0;
        array1[1][0] = 2.0;
        array1[0][1] = 1.0;
        array1[1][1] = 0.0;
        array1[0][2] = 4.0;
        array1[1][2] = 1.0;
        NSLog(@"array 1 : n%@",[self.matrixHandler stringForMatrix:array1 ofSize:CGSizeMake(2, 3)]);

工作正常

self.matrixHandler = [[SMMatrixHandler alloc] init];
        double **array1 = (double **)malloc(3*2*sizeof(double)); // height
        for (int i = 0; i < 3; ++i)
            array1[i] = new double[2]; // width
        array1[0][0] = 1.0;
        array1[1][0] = 2.0;
        array1[0][1] = 1.0;
        array1[1][1] = 0.0;
        // array1[0][2] = 4.0;
        array1[1][2] = 1.0;
        NSLog(@"array 1 : n%@",[self.matrixHandler stringForMatrix:array1 ofSize:CGSizeMake(2, 3)]);

该方法stringForArray如下所示:

- (NSString *)stringForMatrix:(double **)m ofSize:(CGSize)s {
    NSString *string = @"";
    for (int i = 0; i < s.height; i++) {
        for (int j = 0; j < s.width; j++) {
            string = [string stringByAppendingFormat:@"%f ",m[j][i]];
        }
        string = [string stringByAppendingString:@"n"];
    }
    return string;
}

您的大小计算不正确,因为它们与您的使用情况不匹配。此代码

double **array1 = (double **)malloc(3*2*sizeof(double)); // height

为六个double分配空间,但它用作三个指向double的指针的存储。

由于您编写的是C++代码,而不是 C 代码,因此您可以选择使用 std::vector 容器 - 这是此类情况的首选。它使您无需手动管理内存,并为您提供与原始数组相匹配的执行速度。

在顶部添加#include <vector>,然后按如下方式更改声明:

std::vector<std::vector<double> > array1(3, std::vector<double>(2, 0.0));

使用该数组的代码保持不变。

问题是你分配了一个 6 个双精度数组,但将其视为双精度数组数组。 即使您分配正确,线条

  array1[0][2] = 4.0;
  array1[1][2] = 1.0;

错误的,因为索引 2 是第三个条目,而您正在查看一个包含 2 个项目数组的 3 个项目数组。

您的代码应如下所示:

double** array1 = new double*[3];
for (int i = 0; i < 3; ++i)
{
    array1[i] = new double[2];
}
array1[0][0] = 1.0;
array1[0][1] = 2.0;
array1[1][0] = 1.0;
array1[1][1] = 0.0;
array1[2][0] = 4.0;
array1[2][1] = 1.0;

甚至更好,像这样:

vector< vector<double> > vec(3, vector<double>(2));
vec[0][0] = 1.0;
vec[0][1] = 2.0;
vec[1][0] = 1.0;
vec[1][1] = 0.0;
vec[2][0] = 4.0;
vec[2][1] = 1.0;

编辑:矢量的优势是,如果你越界,它们就会抛出。 第一个示例中的裸数组将表现出未定义的行为。