Pregunta

Tengo un 2D NsArray de números de cadena que me gustaría convertir a una matriz 2D C de dobles para usar con funciones BLAS/LAPACK (a través del marco de Acelerate). Esta línea de código parece funcionar, sin embargo, parece ser increíblemente ineficiente y finalmente se bloquea debido a un error de malloc. ¿Existe una forma más eficiente de convertir este 2D NsArray a una matriz C? ¿O una forma convienent de usar nsArrays con 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 es una matriz que contiene líneas de un archivo que se analizan en números respectivos.

¿Fue útil?

Solución

Aquí hay pocas cosas que tratan con la memoria.

1.componentsSeparatedByString: Crea una matriz automática. Dado que está en bucle para cada objeto dentro de esa cadena, está creando una matriz similar varias veces. Como los objetos autorelados no se liberan hasta el final del runloop, esto podría obstruir la memoria. Es mejor hacer esto una vez sacando la llamada del método del bucle interno.

2.El valor de i es el más confuso. Pasas i Como el índice de gridDataC. Probablemente debería ser i - 6 Si estás empezando desde 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];
    }  
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top