Domanda

Sono nuovo a Matlab, ma ho pescato la documentazione e non riesco a trovare una risposta per quello che sto cercando.

Ho fatto una serie di calcoli su una matrice e ho finito con un elenco di indici e un elenco di valori che dovrebbero andare in quegli indici.

per esempio:

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

Quello che voglio essere in grado di fare è costruire una matrice quadrata (di dimensioni n in base al più grande indice valutato presente nella matrice degli indici), in modo tale che la prima colonna di Indices viene utilizzato per indicizzare la prima riga del Result matrice e i valori di Data sono messi nelle posizioni corrispondenti del Result Matrix con tutti i luoghi non indicizzati con set di dati su 0.

Cioè con le matrici di dati e indici dall'alto voglio che la matrice finale sembri:

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

(Potrebbero esserci alcuni errori con quanto sopra come l'ho fatto a mano, ma dovrebbe fornire un'idea di cosa voglio fare)

C'è un modo veloce in modo semplice in Matlab per farlo? Molte funzionalità restituiscono gli indici e speravo che ci sarebbe stato un modo semplice per aggiornare/costruire una matrice usando questi indici.

Grazie,

Greg

È stato utile?

Soluzione

Il modo più pulito che so come farlo è creando una matrice sparsa in base ai tuoi dati e indici:

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

Spero che qualcuno venga e ci mostri un metodo ancora più pulito.

Altri suggerimenti

Quello che stai descrivendo è realizzato in questo modo:

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

Nota che ottenere II tramite la meshgrid la dichiarazione è equivalente a II=repmat(1:size(Data,2),size(Data,1),1);.

Questa soluzione, basata su bsxfun, sembra essere un po 'più veloce di quelli di @nispio e @chappjc:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top