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 № 1Se 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)