在Matlab第2部分中,通过另一个向量迭代一个向量

在Matlab第2部分中,通过另一个向量迭代一个向量,matlab,Matlab,这是一个类似于我在 我使用Luis的建议和以下代码: 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生成了一个很好的结果,它是一个1024x10矩阵,所有可能的排列为1和2,长度为10列。我要做的是删除所有不是按递增顺序排列的行。

这是一个类似于我在

我使用Luis的建议和以下代码:

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生成了一个很好的结果,它是一个1024x10矩阵,所有可能的排列为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

关于如何优化我的代码,使我不需要使用嵌套循环,有什么想法吗

通过两个行操作,超级简单但不太明显的解决方案:

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
;)的不那么琐碎的值感兴趣

谢谢各位。你的建议结合起来很有魅力!相比之下,我的模拟是闪电般的快。
C = flipud(triu(ones(s+1,s).*(max(A)-min(A))) + min(A));