Help with a vectorizing: rearranging a matrix

1 visualización (últimos 30 días)
Dylan Altschuler
Dylan Altschuler el 5 de Mayo de 2021
Comentada: Dylan Altschuler el 12 de Mayo de 2021
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 comentarios
James Tursa
James Tursa el 5 de Mayo de 2021
Editada: James Tursa el 5 de Mayo de 2021
Is the F function vectorized? I.e., if i and j are same-sized vectors, will F return a same-sized vector?
Dylan Altschuler
Dylan Altschuler el 5 de Mayo de 2021
Hi James,
yes, I think so!

Iniciar sesión para comentar.

Respuestas (1)

Aditya Patil
Aditya Patil el 12 de Mayo de 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]);
Next, generate the indices to be used for A, using sub2ind.
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);
  1 comentario
Dylan Altschuler
Dylan Altschuler el 12 de Mayo de 2021
Thank you! I appreciate the help.
I will time this to check if it performs better than array fun

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Productos


Versión

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by