How to vectorize?
Mostra commenti meno recenti
Hi, is it possible to avoid the loop? Thanks.
x=(1:3:r);
[r,c]=size(Tr);
E1=zeros(r,c);
for i=1:c
E1(x,i)=E(Tr(r,i),i);
end
>> size(Tr)
ans =
21 6
5 Commenti
DGM
il 29 Lug 2023
What is z? What is Tr?
What is the value of r before it's redefined? Is it the same?
pipin
il 29 Lug 2023
pipin
il 29 Lug 2023
Image Analyst
il 29 Lug 2023
Not seeing it. Again, what is Tr and E (not E1, but E)?
Does your for loop even work? What is the desired output?
If you have any more questions, then attach your data and missing code to read it in after you read this:
pipin
il 29 Lug 2023
Risposta accettata
Più risposte (1)
Bruno Luong
il 29 Lug 2023
Modificato: Bruno Luong
il 29 Lug 2023
If you want obscure code by avoiding for-loop
E = rand(10,5)
Tr = randi(size(E,1),9,size(E,2))
[r,c]=size(Tr);
x=(1:3:r);
[r,c]=size(Tr);
x=(1:3:r);
% Your method
E1=zeros(r,c);
for i=1:c
E1(x,i)=E(Tr(r,i),i);
end
E1
% vectorized method
E1=zeros(r,c);
i=1:c;
E1(x(:) + (i-1)*r) = repmat(E(Tr(r,i) + (i-1)*size(E,1)),length(x),1);
E1
13 Commenti
Bruno Luong
il 29 Lug 2023
PS: I have a feeling that is NOT what you expect to get.
pipin
il 29 Lug 2023
"I made some mistakes while creating the code because it's a bit laborious. "
I knew it, not it is not because laborious, it's because you are simply not serious on what you are doing.
row=10;
columns=5;
step=3;
%%*************
E = round(rand(row,columns)*10)
Tr = randi(size(E,1),row,size(E,2))
[r,c]=size(Tr);
x=(1:step:r);
% Your method
E1=zeros(r,c);
for i=1:c
E1(x,i)=E(Tr(x,i),i);
end
E1
% vectorized method
E1=zeros(r,c);
i=1:c;
E1(x(:) + (i-1)*r) = E(Tr(x,i) + (i-1)*size(E,1));
E1
pipin
il 29 Lug 2023
Bruno Luong
il 29 Lug 2023
Modificato: Bruno Luong
il 29 Lug 2023
Why do you think it does?
This is the timining of the Online server, your PC does not have anough memory IMO. Each array E, E1, and Tr take 2 Gb, so a total of 6 Gb of free RAM is needed.
row=500000;
columns=500;
step=300;
%%*************
E = round(rand(row,columns)*10);
Tr = randi(size(E,1),row,size(E,2));
tic
[r,c]=size(Tr);
x=(1:step:r);
% Your method
E1=zeros(r,c);
for i=1:c
E1(x,i)=E(Tr(x,i),i);
end
toc
tic
% vectorized method II
[r,c]=size(Tr);
x=(1:step:size(E,1));
E1=zeros(r,c);
E1(x,:) = E(Tr(x,:) + (0:c-1)*size(E,1));
toc
pipin
il 29 Lug 2023
Bruno Luong
il 29 Lug 2023
Modificato: Bruno Luong
il 29 Lug 2023
"often with vectorization I see advantages of 1:10 as speed compared to loops"
Your information is surely NOT up-to-date and too generic to have any real value.
Bruno Luong
il 2 Ago 2023
Modificato: Bruno Luong
il 2 Ago 2023
No your solution is NOT good as it only catches Tr == 0 at column 0. For other column a2 is not 0 so you won't correct the overflowed row indexing.
Bruno Luong
il 2 Ago 2023
Modificato: Bruno Luong
il 2 Ago 2023
Code to handle the case Tr == 0
c = size(Tr,2);
m = size(E,1);
x = 1:step:m;
E1 = zeros(size(Tr));
Trx = Tr(x,:);
iE = Trx + m*(0:c-1);
tmp = E(max(iE,1));
tmp(Trx == 0) = 0;
E1(x,:) = tmp;
it does not handle still the case Tr > m or Tr < 0.
If you havve data that are not valid for proper indexing it will be a mess to deal with.
pipin
il 2 Ago 2023
Categorie
Scopri di più su General Applications in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!