2014-02-28 92 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