/ / ¿Es posible crear una submatriz sin usar memoria adicional en Matlab? - matlab, punteros, memoria, mex

¿Es posible crear una sub-matriz sin usar memoria adicional en Matlab? - matlab, punteros, memoria, mex

Bueno, estoy intentando implementar un algoritmo enMatlab. Requiere el uso de una porción de una matriz de alta dimensión dentro de un bucle for. Cuando trato de usar la indexación lógica, Matlab crea una copia adicional de ese segmento y, dado que mi matriz es enorme, lleva mucho tiempo.

slice = x(startInd:endInd);

Lo que estoy tratando de hacer es usar ese segmento sin copiarlo. Solo necesito los datos del sector para ingresar un operador lineal. No actualizaré esa parte durante las iteraciones.

Para hacerlo, intenté escribir un archivo Mex cuya salida sea un doble tipo matriz y cuyo tamaño es igual al tamaño de datos de segmento deseado.

plhs[0] = mxCreateUninitNumericMatrix(0, 0, mxDOUBLE_CLASS,mxREAL); % initialize but do not allocate any additional memory
ptr1 = mxGetPr(prhs[0]); % get the pointer of the input data

Luego, establezca el puntero de la salida en el índice inicial de los datos de entrada.

mxSetPr(plhs[0], ptr1+startInd);
mxSetM(plhs[0], 1);
mxSetN(plhs[0], (endInd-startInd)); % Update the dimensions as intended

Cuando configuro el índice inicial en cero, funciona bien. Cuando trato de dar con valores distintos a 0, el archivo Mex se compila sin error, pero Matlab se bloquea cuando se llama a la función Mex.

slice = mex_slicer(x, startInd, endInd);

¿Cuál podría ser el problema aquí?

Respuestas

0 para la respuesta № 1

La forma en que asigna el puntero de datos a la matriz, significa que MATLAB intentará liberar esa memoria cuando la matriz se elimine o tenga algo más asignado. Intentando llamar free usando un puntero que no fue obtenido por malloc causará un accidente.

Desafortunadamente, MATLAB no admite "vistas", matrices que apuntan a partes de una matriz diferente. Entonces no hay forma de hacer lo que quieres hacer.

Una solución alternativa sería:

  • almacenar sus datos de manera diferente, de modo que no lleve tanto tiempo indexarlos (por ejemplo, en matrices más pequeñas)?

  • Realice todos sus cálculos en C o C ++ dentro de un archivo MEX, donde simplemente puede apuntar a subrangos de un bloque de datos más grande.


0 para la respuesta № 2

Vea esta presentación de FEX sobre la creación de MATLABvariables que "apuntan" a los datos internos de una variable existente. Puede hacerlo como una copia de datos compartida que está diseñada para ser segura (pero incurre en una sobrecarga adicional), o como una referencia directa desprotegida (más rápido pero corre el riesgo de bloquear MATLAB si no lo borra correctamente).

https://www.mathworks.com/matlabcentral/fileexchange/65842-sharedchild-creates-a-shared-data-copy-of-a-contiguous-subsection-of-an-existing-variable