Pergunta

Sou novo no Matlab, mas vasculhei a documentação e não consigo encontrar uma resposta para o que estou procurando.

Fiz vários cálculos em uma matriz e acabei com uma lista de índices e uma lista de valores que devem ser vivos nesses índices.

por exemplo:

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

e

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

O que eu quero poder fazer é construir uma matriz quadrada (do tamanho n com base no maior índice valorizado encontrado na matriz dos índices), de modo que a primeira coluna de Indices é usado para indexar a primeira linha do Result matriz e os valores de Data são colocados nos locais correspondentes do Result Matriz com todos os lugares não indexados com o conjunto de dados para 0.

Ou seja, com as matrizes de dados e índices de cima, quero que a matriz final pareça:

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

(Pode haver alguns erros com o exposto acima ao fazer isso à mão, mas deve fornecer uma idéia do que estou querendo fazer)

Existe uma maneira rápida de fazer isso no Matlab para fazer isso? Muitas funções retornam os índices e eu esperava que houvesse uma maneira fácil de atualizar/construir uma matriz usando esses índices.

Obrigado,

Greg

Foi útil?

Solução

A maneira mais limpa que eu sei como fazê -lo é criando uma matriz esparsa com base em seus dados e índices:

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

Espero que alguém apareça e nos mostre um método ainda mais limpo.

Outras dicas

O que você está descrevendo é realizado assim:

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

Observe que conseguir II através de meshgrid A declaração é equivalente a II=repmat(1:size(Data,2),size(Data,1),1);.

Esta solução, com base em bsxfun, parece ser um pouco mais rápido que os @nispio e @chappjc:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top