我正在尝试编写一个类来在 Objective-c 中操作矩阵,最初我使用的是 NSArrays 和 NSNumbers,但这导致我正在做的事情(模拟双摆)代码非常慢,所以我决定尝试一下并将我的数组重写为 C++ 数组,但是我遇到了我不知道如何解决的问题。
运行此代码会出现错误 -[SMFiniteDifferenceHelper matrixHandler]: 无法识别的选择器发送到实例 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
s,但它被用作三个指向 double
的指针的存储。 .
由于您正在编写 C++ 代码,而不是 C 代码,因此您可以选择使用 std::vector
容器 - 此类情况的首选。它使您无需手动管理内存,并为您提供与原始数组相匹配的执行速度。
添加#include <vector>
在顶部,然后按如下方式更改声明:
std::vector<std::vector<double> > array1(3, std::vector<double>(2, 0.0));
使用数组的代码保持不变。
关于Objective-c 中的 C++ 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19810221/