【问题标题】:Creating a C Array from 2D NSArray从 2D NSArray 创建一个 C 数组
【发布时间】:2011-06-15 00:05:19
【问题描述】:

我有一个字符串数字的 2D NSArray,我想将其转换为双精度的 2D C 数组,以用于 BLAS/LAPACK 函数(通过加速框架)。 这行代码似乎可以工作,但似乎效率极低,最终由于 malloc 错误而崩溃。有没有更有效的方法将此 2D NSArray 转换为 C 数组?还是将 NSArrays 与 BLAS/LAPACK 一起使用的便捷方式?

double gridDataC[[nrows intValue]+1][[ncol intValue]+1];

for(i=6;i<[fileLines count]-1;i++){
    for(j=0;j<[ncol intValue]-1;j++){
        gridDataC[i][j]=[[[[fileLines objectAtIndex:i] componentsSeparatedByString:@" "] objectAtIndex:j] doubleValue];
    }  
} 

fileLines 是一个数组,其中包含被解析为相应数字的文件行。

【问题讨论】:

  • i 从 6 开始而不是 0 有什么原因吗?
  • 数据上方有5个标题行。

标签: objective-c ios blas acc


【解决方案1】:

这里很少有涉及内存的东西。

1.componentsSeparatedByString: 创建一个自动释放的数组。由于您正在循环该字符串中的每个对象,因此您正在多次创建类似的数组。由于 autoreleased 的对象直到 r​​unloop 结束才被释放,这可能会阻塞内存。最好将方法调用带出内部循环来执行一次。

2.i的值是最容易混淆的。您将i 作为gridDataC 的索引传递。如果您从i = 6 开始,它可能应该是i - 6

double gridDataC[[nrows intValue] + 1][[ncol intValue] + 1];

for( i = 6; i < [fileLines count] - 1; i++ ){
    NSArray * components = [[fileLines objectAtIndex:i] componentsSeparatedByString:@" "];
    for( j = 0; j < [ncol intValue] - 1; j++ ){
        gridDataC[i - 6][j] = [[components objectAtIndex:j] doubleValue];
    }  
} 

【讨论】:

  • 这很有意义!感谢您的建议,我会给他们一个机会。
猜你喜欢
  • 1970-01-01
  • 2011-02-11
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多