在Matlab第2部分中迭代一个向量到另一个向量

时间:2014-02-28 01:26:56

标签: matlab

这是与Iterate one vector through another in 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列。我想要做的是删除任何不按递增顺序排列的行。例如,现在我得到:

 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

除第3行外,所有内容都有效,因为它从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

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

1 个答案:

答案 0 :(得分: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;)

的不那么微不足道的价值感兴趣