/ / MATLAB Come compilare le singole voci di una matrice sparsa utilizzando una forma vettoriale? - prestazioni, matlab, matrice, vettorizzazione, matrice sparsa

MATLAB Come compilare le singole voci di una matrice sparsa utilizzando una forma vettoriale? - prestazioni, matlab, matrice, vettorizzazione, matrice sparsa

Ho una matrice sparsa e ho bisogno di riempire certivoci con un valore specifico, sto usando un ciclo for in questo momento, ma so che non è il modo corretto per farlo, quindi mi chiedevo se è possibile vettorizzare questo ciclo for?

K = sparse(N);
for i=vectorofrandomintegers
K(i,i) = 1;
end

Se lo vettorialo normalmente così:

K(A,A) = 1;

quindi riempie tutte le voci in ogni riga denotate da A mentre io voglio le voci individuali (ad es. K(1,1) = 1 o K(6,6)=1).

Inoltre, le voci non sono diagonalmente adiacenti, quindi non posso ritagliare la matrice di identità.

risposte:

1 per risposta № 1

Se si intende utilizzare un metodo vettoriale, è necessario ottenere gli indici lineari da impostare. Il problema è che se si definisce la matrice sparsa come K = sparse(N) e quindi indicizza linearmente in K, si estenderebbela dimensione di esso in una sola direzione e non lungo sia la riga che la colonna. Pertanto, devi specificare in MATLAB che sei cercando di usare questo sparse per memorizzare un array 2D. Quindi, sarebbe -

K = sparse(N,N);

Ottieni gli indici lineari da indicizzare in K usando sub2ind e impostali -

ind1 = sub2ind([N N],vectorofrandomintegers,vectorofrandomintegers);
K(ind1) = 1;

1 per risposta № 2

È abbastanza semplice

Io userei

K((A-1)*N+A))=1;

credo che dovrebbe risolvere il tuo problema trattando la matrice come un vettore


1 per risposta № 3

Invece di dichiarare e poi riempiendo una matrice sparsa, puoi riempirla allo stesso tempo lo definisci:

i = vectorofrandomintegers; j = i;
K = sparse(i,j,1,N,N)