# Help with a vectorizing: rearranging a matrix

1 view (last 30 days)
Dylan Altschuler on 5 May 2021
Commented: Dylan Altschuler on 12 May 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 CommentsShowHide 1 older comment
Dylan Altschuler on 5 May 2021
Hi James,
yes, I think so!

Aditya Patil on 12 May 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);
Dylan Altschuler on 12 May 2021
Thank you! I appreciate the help.
I will time this to check if it performs better than array fun

R2021a

### Community Treasure Hunt

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

Start Hunting!

Translated by