C++ Matrix in objective-c
C++ Matrix in objective-c
我正在尝试编写一个类来操作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;
编辑:矢量的优势是,如果你越界,它们就会抛出。 第一个示例中的裸数组将表现出未定义的行为。
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 如何将数组从Objective-C发送到C++函数
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- C++ Matrix in objective-c
- pcl::io::loadPCDFile from objective-c ends in EXC_BAD_ACCESS
- Objective-C in Qt with Mavericks