una - posicion de un valor en un vector matlab
Usa un vector como índice de una matriz. (3)
Estoy escribiendo una función MATLAB para leer los datos en una matriz n-dimensional (tamaño de dimensión variable). Necesito poder acceder a un punto específico en la Matriz (para escribirlo o leerlo, por ejemplo), pero no sé de antemano cuántos índices especificar.
Actualmente tengo un vector current_point
que itero para especificar cada índice, y un vector max_points
que especifica el tamaño de la matriz. Entonces, si, por ejemplo, quisiera una matriz tridimensional de tamaño 1000 por 15 por 3, max_points = [1000 15 3]
, y current_point
iteran 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 current_point
como un índice a la matriz de esta manera:
output_matrix(current_point) = val
Pero aparentemente, algo como output_matrix([1 2 3]) = val
simplemente configurará outputmatrix(1:3) = 30
. No puedo usar variables ficticias porque a veces la matriz necesitará 3 índices, otras veces 4, otras 2, etc., por lo que un vector de longitud variable es realmente lo que necesito aquí. ¿Hay una forma sencilla 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 el de las otras preguntas a las que he vinculado. Si solo está indexando un solo punto con su vector current_point
(es decir, es solo un vector de n-elementos de subíndices en su matriz n-dimensional), entonces puede usar una solución simple donde convierte current_point
en una matriz de celdas de subíndices. utilizando la función num2cell
y utilícela 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 escribir subCell{1}, subCell{2}, ...
, que es el equivalente de escribir current_point(1), current_point(2), ...
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 ser cualquier número de dimensiones) como una cell
. Si lo tiene almacenado como un vector, simplemente use num2cell()
para convertirlo en una celda.
Ahora puede asignar fácilmente un valor a esto como A(indx)=value;
. He usado variables diferentes a las suyas 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á haciendo un bucle desde (1,1,1)
hasta cierto valor, (1000,15,3)
y asignando un valor a cada uno de estos puntos. Si recorre las columnas, puede reemplazar toda esta operación con una solución vectorizada.
Sea finalElement={1000,15,3}
el paso final del bucle. Como antes, encuentra el índice lineal como
index=sub2ind(size(A),finalElement{:});
Ahora, si tiene los valores que asigna en el bucle almacenados como un solo vector, puede simplemente asignarlos en un solo paso como
A(1:index)=values;
Sé que es demasiado tarde, pero para cualquiera que encuentre este tema. la forma más fácil que me funciona es usar: diag(A (x(:),y(:)) )
;
desafortunadamente esto funciona solo si necesita obtener valores de la matriz, no para cambiar valores