Pregunta

Soy nuevo en Matlab, pero he rastreado la documentación y no puedo encontrar una respuesta para lo que estoy buscando.

He hecho varios cálculos en una matriz y he terminado con una lista de índices y una lista de valores que deberían ir en esos índices.

por ejemplo:

Data =

         0         0         0         0         0         0
    3.7417    3.7417    3.7417    7.0711    3.3166    3.3166
    4.2426    4.2426    3.7417    7.0711    5.3852    7.0711
    7.0711    6.0828    5.3852    7.4833    6.0828    7.6158
    7.1414    7.4833    7.8740    8.7750    7.1414    7.8740

y

Indices =

     1     2     3     4     5     6
     3     3     1     1     6     5
     2     1     2     6     3     4
     4     5     5     2     2     2
     5     4     6     5     1     3

Lo que quiero poder hacer es construir una matriz cuadrada (de tamaño n basado en el índice valorado más grande que se encuentra en la matriz de índices), de modo que la primera columna de Indices se usa para indexar la primera fila del Result matriz, y los valores de Data se colocan en las ubicaciones correspondientes del Result matriz con todos los lugares no indexados con datos establecidos en 0.

Es decir, con las matrices de datos e índices de arriba, quiero que la matriz final se vea como:

Result =
          0   4.2426    3.7417    7.0711    7.1414         0
     4.2426        0    3.7417    7.4833    6.0828         0
     3.7417   3.7417         0         0    5.3852    7.8740 
     7.0711   7.4833         0         0    8.7750    7.0711
     7.1414   6.0828    5.3852         0         0    3.3166
          0   7.6158    7.8740    7.0711    3.3166         0

(Puede haber algunos errores con lo anterior como lo hice a mano, pero debería proporcionar una idea de lo que quiero hacer)

¿Hay una manera fácil de hacer esto rápido para hacer esto? Muchas funciones devuelven los índices y esperaba que hubiera una manera fácil de actualizar/construir una matriz utilizando estos índices.

Gracias,

Gregón

¿Fue útil?

Solución

La forma más limpia que sé es crear una matriz escasa basada en sus datos e índices:

[M,N] = size(Indices); indmax = max(Indices(:));
Result = sparse(repmat(1:N,M,1),Indices,Data,indmax,indmax);

Esperemos que alguien venga y nos muestre un método aún más limpio.

Otros consejos

Lo que está describiendo se logra así:

[II,JJ]=meshgrid(1:size(Data,2),1:size(Data,1));
Result = zeros(size(Data,2));
Result(sub2ind(size(Result),II(:),Indices(:))) = Data(:);

Tenga en cuenta que obtener II a través de meshgrid la declaración es equivalente a II=repmat(1:size(Data,2),size(Data,1),1);.

Esta solución, basada en bsxfun, parece ser un poco más rápido que los de @nispio y @chappjc:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top