How can I change for-loop into matrix way?

1 次查看(过去 30 天)
I'd like to vectorize the for-loop below, but cannot come up with any idea. Could you help me?
for i=1:100
for j=1:1000
A(i+1,j)= B(find(C(B==A(i,j),:,D==E(i))>F(i,j),1));
end
end
  9 个评论
icdi
icdi 2021-6-8
编辑:icdi 2021-6-8
Yes all of your points are right.
D is 3x1. For all i and j, A(i,j) is supposed to have one of elements of B, and E(i) also has one of elements of D. So this code can give the series of numbers between 1 and 15.
Matt J
Matt J 2021-6-8
编辑:Matt J 2021-6-8
So the elements of B and D are all unique? Also, what is supposed to happen if find() returns empty [], i.e., if
C(B==A(i,j),k,D==E(i)) < F(i,j)
for all k=1...15?

请先登录,再进行评论。

采纳的回答

Matt J
Matt J 2021-6-8
This gives some speed-up.
%Fake Data
m=100;n=1000;
B=rand(15,1);
D=rand(3,1);
A=B(randi(15,m+1,n));
E=D(randi(3,m+1,1));
C=rand(15,15,3);
F=0.3*ones(size(A));
%Original version
tic;
for i=1:m
for j=1:n
A(i+1,j)= B(find(C(B==A(i,j),:,D==E(i))>F(i,j),1));
end
end
toc
Elapsed time is 0.372233 seconds.
A1=A;
%Proposed version
tic;
locD=(1:3)*(D==E.');
for i=1:m
Ai=A(i,:);
Ei=E(i);
Fi=F(i,:);
[~,locB]=ismember(Ai,B);
[~,idx]=max( C(locB,:,locD(i))>Fi(:) ,[],2);
A(i+1,:)= B(idx);
end
toc
Elapsed time is 0.050406 seconds.
A2=A;
isequal(A1,A2)
ans = logical
1

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by