Use un vector como un índice para una matriz

Estoy escribiendo una función MATLAB para leer datos en una matriz n-dimensional (tamaño de dimensión variable). Necesito poder acceder a un punto específico en la Matriz (para escribir o leer, por ejemplo), pero no sé de antemano cuántos índices especificar.

Actualmente tengo un vector de max_points que max_points para especificar cada índice, y un vector de max_points que especifica el tamaño de la matriz. Entonces, si, por ejemplo, quisiera una matriz tridimensional de tamaño 1000-by-15-by-3, max_points = [1000 15 3] , y current_point iterates de [1, 1, 1] a [1000, 15, 3] ( [1, 1, 1] -> [1000, 1, 1] -> [1, 2, 1] -> [1000, 2, 1] -> …). Lo que me gustaría poder hacer es alimentar el current_point como un índice a la matriz, así:

 output_matrix(current_point) = val 

Pero aparentemente algo como output_matrix([1 2 3]) = val simplemente establecerá outputmatrix(1:3) = 30 . No puedo usar variables ficticias porque a veces la matriz necesitará 3 índices, otras veces 4, otras veces 2, etc., así que realmente necesito un vector de longitud variable. ¿Hay una manera simple de usar un vector como puntos en un índice?

El uso de la función sub2ind para crear un índice lineal es la solución típica a este problema, como se muestra en esta pregunta estrechamente relacionada . También puede calcular un índice lineal usted mismo en lugar de llamar a sub2ind .

Sin embargo, su caso puede ser más simple que aquellos en las otras preguntas a las que me he vinculado. Si solo indexa un solo punto con su vector de current_point (es decir, es solo un vector de elementos n de subíndices en su matriz n-dimensional), entonces puede usar una solución simple donde convierta el current_point en una matriz de subíndices de celdas usando la función num2cell y usándola para crear una lista de índices separados por comas . Por ejemplo:

 current_point = [1 2 3 ...]; % A 1-by-n array of subscripts subCell = num2cell(current_point); % A 1-by-n cell array of subscripts output_matrix(subCell{:}) = val; % Update the matrix point 

La operación subCell{:} crea el equivalente de tipear subCell{1}, subCell{2}, ... , que es el equivalente a tipear current_point(1), current_point(2), ...

Sé que es demasiado tarde, pero para cualquiera que encuentre este tema. la forma más fácil para mí es usar: diag(A (x(:),y(:)) ) ;

desafortunadamente esto solo funciona si necesita obtener valores de la matriz, no para cambiar valores

Puede usar la función sub2ind para obtener el índice lineal del subíndice.

Ejemplo:

 A=magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 selectElement={2,3}; %# get the element at position 2,3 in A. indx=sub2ind(size(A),selectElement{:}); A(indx) ans = 10 

En el ejemplo anterior, he almacenado los subíndices (puede tener cualquier número de dimensiones) como una cell . Si lo tiene almacenado como un vector, simplemente use num2cell() para convertirlo a una celda.

Ahora puede asignar fácilmente un valor a esto como A(indx)=value; . He usado variables diferentes a la suya para mantener la respuesta general, pero la idea es la misma y solo necesita reemplazar los nombres de las variables.

También mencionó en su publicación que está pasando de (1,1,1) hasta cierto valor (1000,15,3) y asignando un valor a cada uno de estos puntos. Si está recorriendo las columnas, puede reemplazar toda esta operación con una solución vectorizada.

Deje que finalElement={1000,15,3} sea ​​el último paso del ciclo. Como antes, encuentre el índice lineal como

 index=sub2ind(size(A),finalElement{:}); 

Ahora, si tiene los valores que asigna en el bucle almacenados como un único vector, values , simplemente puede asignarlo en un solo paso como

 A(1:index)=values;