Создание массива C из 2D NSArray - PullRequest
0 голосов
/ 15 июня 2011

У меня есть двумерный NSArray строковых чисел, которые я хотел бы преобразовать в двумерный массив двойных чисел 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 - это массив, содержащий строки файла, которые разбиты на соответствующие числа.

1 Ответ

0 голосов
/ 15 июня 2011

Здесь есть несколько вещей, которые имеют дело с памятью.

1. componentsSeparatedByString: создает автоматически выпущенный массив. Поскольку вы зацикливаетесь на каждом объекте в этой строке, вы создаете похожий массив несколько раз. Поскольку автоматически выпущенные объекты не освобождаются до конца цикла выполнения, это может засорить память. Лучше сделать это один раз, выведя вызов метода из внутреннего цикла.

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];
    }  
} 
...