这是与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
有关如何优化代码的任何想法,所以我不需要使用嵌套循环?
答案 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
;)