如何在matlab中重写速度优化的多个for循环?

如何在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))

我希望我的代码运行得更快,而这一部分似乎使代码运行得更慢

我试图将其矢量化并使用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))
                   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]