How to vectorize?
3 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Image Analyst
2023 年 7 月 29 日
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:
採用された回答
Bruno Luong
2023 年 7 月 30 日
編集済み: Bruno Luong
2023 年 7 月 30 日
Just to pull out the right answer (my previous answer applied on a WRONG calculation specified by OP)
% vectorized method
c = size(Tr,2);
m = size(E,1);
x = 1:step:m;
E1 = zeros(size(Tr));
E1(x,:) = E(Tr(x,:) + (0:c-1)*m);
2 件のコメント
Bruno Luong
2023 年 7 月 30 日
編集済み: Bruno Luong
2023 年 7 月 30 日
OP is Original Poster, it's you who wrote : "excuse me.. z=r...i change it in code" ... remember?
My answer (not the comments below it) is wrong because the question is wrong.
その他の回答 (1 件)
Bruno Luong
2023 年 7 月 29 日
編集済み: Bruno Luong
2023 年 7 月 29 日
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 件のコメント
Bruno Luong
2023 年 8 月 2 日
編集済み: Bruno Luong
2023 年 8 月 2 日
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.
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!