2014-02-28 55 views
0

这是在Iterate one vector through another in Matlab迭代一个通过另一个在Matlab部位矢量2

我的帖子了类似的请求,我使用路易斯的建议,用下面的代码:

E=[1 2 3 4 5 6 7 8 9 10]; 
A = [1 2]; 
s = size(E,2); 
t = numel(A); 
C = cell(1,s); 
[C{:}] = ndgrid(A); 
C = cat(s+1, C{:}); 
C = fliplr(reshape(C, t^s, s)); 

这会产生一个好的结果C作为1024×10的矩阵,其中1和2的所有可能的排列组合为10列的长度。我想要做的是删除任何不按升序排列的行。比如现在我得到:

1  1  1  1  1  1  1  1  1  1 
1  1  1  1  1  1  1  1  1  2 
1  1  1  1  1  1  1  1  2  1 
1  1  1  1  1  1  1  1  2  2 

全部相同,只是第三排有效的,因为它从2去回1 我有代码来获得想要的结果,但它是非常缓慢和低效。现在

E=[1 2 3 4 5 6 7 8 9 10]; 
A = [1 2]; 
s = size(E,2); 
t = numel(A); 
C = cell(1,s); 
[C{:}] = ndgrid(A); 
C = cat(s+1, C{:}); 
C = fliplr(reshape(C, t^s, s)); 
min=0; 
    for row=1:size(C,1) 
     for col=1:size(C,2) 
      if(C(row,col)>min) 
      min=C(row,col); 
      elseif(C(row,col)<min) 
      C(row,:)=0; 
      continue; 
      end 
     end 
     min=0; 
    end 
C = C(any(C,2),:); %remove all zero rows 

所需的输出是:

1  1  1  1  1  1  1  1  1  1 
1  1  1  1  1  1  1  1  1  2 
1  1  1  1  1  1  1  1  2  2 
1  1  1  1  1  1  1  2  2  2 
1  1  1  1  1  1  2  2  2  2 
1  1  1  1  1  2  2  2  2  2 
1  1  1  1  2  2  2  2  2  2 
1  1  1  2  2  2  2  2  2  2 
1  1  2  2  2  2  2  2  2  2 
1  2  2  2  2  2  2  2  2  2 
2  2  2  2  2  2  2  2  2  2 

如何优化我的代码,任何想法,所以我并不需要使用嵌套循环?

回答

2

通过一对夫妇行操作的超简单但不-十分那么显而易见的解决方案:

d = diff(C, [], 2); 
m = min(d, [], 2); 
C = C(m>=0, :); 

当然,在这个特殊的例子这将是容易只是产生所产生的直接矩阵:

C = flipud(triu(ones(s+1,s).*(max(A)-min(A))) + min(A)); 

但我相信你也感兴趣的A没有价值的数值;)

+1

+1或者使用'C = C(所有(d> = 0,2),:);' –

+0

谢谢你们。你的建议结合起来就像一个魅力!我的模拟比较闪电般快。 – user3221856