如何在matlab中重写速度优化的多个for循环?
我希望我的代码运行得更快,而这一部分似乎使代码运行得更慢 我试图将其矢量化并使用meshgrid,但无法理解如何在matlab中重写速度优化的多个for循环?,matlab,performance,vectorization,Matlab,Performance,Vectorization,我希望我的代码运行得更快,而这一部分似乎使代码运行得更慢 我试图将其矢量化并使用meshgrid,但无法理解 %generate all noma node combinations with packets combinations_withpackets=[]; for i=1:N for j=1:N if(i~=j) for k=1:N if((k~=i)&&(k~=j))
%generate all noma node combinations with packets
combinations_withpackets=[];
for i=1:N
for j=1:N
if(i~=j)
for k=1:N
if((k~=i)&&(k~=j))
if((packets(i,j)>0)&&(packets(i,k)>0))
combinations_withpackets=[combinations_withpackets;i j k];
end
end
end
end
end
end
这将创建一个形式为[i j k]
的数组,其中i
,j
和k
是节点,在数组的每一行,它们彼此不相等
如果有数据包从节点
i
到j
和节点i
到k,如果我创建了一个随机矩阵packets
,它会将一个[i j k]
组合添加到组合中
N = 50 %size of the packets matrice
packets = round(rand(N,N)); %random matrice
comb = nchoosek(1:N,3); %all combination without permutation
combrow = perms(1:3); %permutation for dimension 3
comb = reshape(comb(:,combrow),[],3); %all combination with permutation
f1 = find(packets(sub2ind([N,N],comb(:,1),comb(:,2)))>0); %check condition 1
f2 = find(packets(sub2ind([N,N],comb(:,1),comb(:,3)))>0); %check condition 2
ind = ismember(f1,f2); %check condition 1&&2
cwp = comb(f1(ind),:); %get the result
它应该比for循环解决方案快得多
该算法产生(N-2)*(N-1)*(N)
组合(正如Ander Biguri所解释的,它几乎是O(N^3)),因此对于大N,它将消耗大量内存。如果我创建一个随机矩阵数据包
:
N = 50 %size of the packets matrice
packets = round(rand(N,N)); %random matrice
comb = nchoosek(1:N,3); %all combination without permutation
combrow = perms(1:3); %permutation for dimension 3
comb = reshape(comb(:,combrow),[],3); %all combination with permutation
f1 = find(packets(sub2ind([N,N],comb(:,1),comb(:,2)))>0); %check condition 1
f2 = find(packets(sub2ind([N,N],comb(:,1),comb(:,3)))>0); %check condition 2
ind = ismember(f1,f2); %check condition 1&&2
cwp = comb(f1(ind),:); %get the result
它应该比for循环解决方案快得多
该算法产生(N-2)*(N-1)*(N)
组合(正如Ander Biguri所解释的,它几乎是O(N^3)),因此对于大N来说,它将消耗大量内存。这里有一个示例,带有示例变量。一个if
直接在另一个if
中有点复杂,可以在第一个声明中简单地使用&&
运算符。否则,请说明您使用meshgrid
做了什么,以及为什么不起作用。这之所以很慢,主要是因为您没有初始化带有数据包的组合,这在MATLAB中非常非常慢。因此,不要初始化并清空数组,而是使用正确(或最大)的大小预先分配数组,然后根据需要进行修剪。这将节省你99%的时间是我的直觉。此外,对于一个大的N,这将是缓慢的,因为它的近似O(n ^ 3)。考虑替换<代码>组合SythsPask= [组合组合,包;i JK];<代码>与包的组合(结束+1,:)=[i j k]代码>这里的一个示例对示例变量很有帮助。如果一个if
直接在另一个中,如果有点复杂,可以在第一个声明中使用&
运算符。否则,请说明您使用meshgrid
做了什么,以及为什么不起作用。这之所以很慢,主要是因为您没有初始化带有数据包的组合,这在MATLAB中非常非常慢。因此,不要初始化并清空数组,而是使用正确(或最大)的大小预先分配数组,然后根据需要进行修剪。这将节省你99%的时间是我的直觉。此外,对于一个大的N,这将是缓慢的,因为它的近似O(n ^ 3)。考虑替换<代码>组合SythsPask= [组合组合,包;i JK];<代码>与包的组合(结束+1,:)=[i j k]代码>