programacion matrices index empty create concatenate concatenar array accessing arrays matlab matrix

arrays - index - matrices en matlab programacion



Matriz de Matrices en MATLAB (6)

Estoy buscando una manera de almacenar una gran cantidad variable de matrices en una matriz en MATLAB.

¿Hay alguna forma de lograr esto?

Ejemplo:

for i: 1:unknown myArray(i) = zeros(500,800); end

Donde se desconoce la longitud variada de la matriz, puedo revisarla con información adicional si es necesario.

Actualización: el rendimiento es la razón principal por la que trato de lograr esto. Lo tenía antes, donde tomaría los datos como una matriz única, lo mostraría en tiempo real y luego procedería a procesar el siguiente conjunto de datos.

Lo intenté usando matrices multidimensionales como lo sugiere Rocco, pero mis datos son tan grandes que me quedé sin memoria, podría tener que buscar otra alternativa para mi caso. Se actualizará mientras intento otras sugerencias.

Actualización 2: Gracias a todos por las sugerencias, sin embargo, debería haber especificado de antemano, la precisión y la velocidad son un factor integral aquí, es posible que tenga que considerar volver a mi método original antes de probar matrices de 3-d y volver a evaluar el método para importar los datos.


Estaba haciendo una representación de volumen en octava (clon de matlab) y construyendo mis matrices en 3D (es decir, una matriz de 2d rebanadas) usando

buffer=zeros(1,512*512*512,"uint16"); vol=reshape(buffer,512,512,512);

El consumo de memoria parecía ser eficiente. (No puedo decir lo mismo para la velocidad posterior de los cálculos: ^)


Si todas las matrices van a tener el mismo tamaño (es decir, 500x800), entonces puede hacer una matriz 3D:

nUnknown; % The number of unknown arrays myArray = zeros(500,800,nUnknown);

Para acceder a una matriz, debe usar la siguiente sintaxis:

subMatrix = myArray(:,:,3); % Gets the third matrix

Puede agregar más matrices a myArray de varias maneras:

myArray = cat(3,myArray,zeros(500,800)); % OR myArray(:,:,nUnknown+1) = zeros(500,800);

Si cada matriz no va a tener el mismo tamaño, necesitaría usar matrices de celdas como Hosam sugirió.

EDITAR: Me perdí la parte sobre quedarse sin memoria. Supongo que tu nDesconocido es bastante grande. Es posible que tenga que cambiar el tipo de datos de las matrices (solo o incluso un tipo uintXX si está utilizando números enteros). Puedes hacer esto en la llamada a ceros:

myArray = zeros(500,800,nUnknown,''single'');


Usa matrices de celdas Esto tiene una ventaja sobre las matrices 3D en que no requiere un espacio de memoria contiguo para almacenar todas las matrices. De hecho, cada matriz se puede almacenar en un espacio diferente en la memoria, lo que le ahorrará errores de falta de memoria si su memoria libre está fragmentada. Aquí hay una función de muestra para crear sus matrices en una matriz de celdas:

function result = createArrays(nArrays, arraySize) result = cell(1, nArrays); for i = 1 : nArrays result{i} = zeros(arraySize); end end

Para usarlo:

myArray = createArrays(requiredNumberOfArrays, [500 800]);

Y para acceder a tus elementos:

myArray{1}(2,3) = 10;

Si no puede conocer la cantidad de matrices por adelantado, simplemente puede usar la indexación dinámica de MATLAB para hacer que la matriz sea tan grande como lo necesite. La sobrecarga de rendimiento será proporcional al tamaño de la matriz de celdas y no se verá afectada por el tamaño de las matrices. Por ejemplo:

myArray{1} = zeros(500, 800); if twoRequired, myArray{2} = zeros(500, 800); end


myArrayOfMatrices = ceros (desconocido, 500,800) si se está quedando sin memoria, agregue más memoria RAM en su sistema y asegúrese de que está ejecutando un sistema operativo de 64 bits. También intente reducir su precisión (¿realmente necesita dobles o puede vivir con solteros: myArrayOfMatrices = single (desconocido, 500,800);

Para agregar a esa matriz, pruebe: myArrayOfMatrices (unknown + 1,:, :) = ceros (500,800);



solo hazlo así

x=zeros(100,200); for i=1:100 for j=1:200 x(i,j)=input(''enter the number''); end end