Help with a vectorizing: rearranging a matrix
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
I was hoping for help with vectorizing the following:
say I have a matrix A and a function F: (i,j) -> j'. I would like to create a new matrix B with the rule: B(i,j) = A(i,F(i, j)).
This can be done with a forloop, but F is very quick to compute and the overhead in running this forloop appears to be a massive bottleneck for me. Is there a better way to write it than the following? I tried arrayfun but this seems to have an even worse overhead?
(Forloop)
B = zeros(size(A));
for i = 1:size(A,1)
for j = 1:size(A,2)
B(i,j) = A(i, F(i,j));
end
end
2 Commenti
James Tursa
il 5 Mag 2021
Modificato: James Tursa
il 5 Mag 2021
Is the F function vectorized? I.e., if i and j are same-sized vectors, will F return a same-sized vector?
Risposte (1)
Aditya Patil
il 12 Mag 2021
Assuming F itself can be vectorized, first calculate all required values of F.
len = 5;
F = randi(len, [len, len]); % Replace this with vectorized calculation of F
A = rand([len, len]);
i = 1:len;
j = 1:len;
is = repmat(i, 1, len);
Fs = reshape(F', 1, []);
Aind = sub2ind(size(A), is, Fs);
Then use these indices to update B.
B = A(Aind);
Vedere anche
Categorie
Scopri di più su Loops and Conditional Statements in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!