假设我有一个3x5矩阵
a=[1 2 4 7 5; 3 4 5 6 2; 6 7 1 2 3];
我希望通过移动它的行来获得所有不同的矩阵。
我写的代码是
a=[1,2,4,7,5;3,4,5,6,2;6,7,1,2,3]; for j=1:3 for i = 1:5 a(j,:)=circshift(a(j,:),[i 1]); disp(a) end end
问题是我应该有25个不同的矩阵,而不是我 有15个(由于j的3个循环中的5个循环)我该如何修复 它?
是否有通用的方法(不适用于特定大小的矩阵)
(编辑)
我注意到这对我的程序效率不高(对于10x24矩阵,结果很大)所以我改变了程序。 新问题:
假设我有一个3x6矩阵
a=[1 2 4 7 5 7;
3 4 5 6 2 9;
6 7 1 2 3 4];
我希望通过移动它的行来获得所有不同的矩阵。但诀窍是每一行都有不同的换档步骤。 (根据不同矩阵内的值定义)
例如: 第1行的步长为3(2个不同的行): 1 2 4 7 5 7和7 5 7 1 2 4 第2行的步长为2(3个不同的行): 3 4 5 6 2 9,5 6 2 9 3 4和2 9 3 4 5 6 第3行的步长为3(2个不同的行): 6 7 1 2 3 4和2 3 4 6 7 1
这意味着我应该有2x3x2 = 12个不同的矩阵。
a=[1,2,4,7,5,7;3,4,5,6,2,9;6,7,1,2,3,4];
b=[2,3,2];
for j=1:3
if b(j) == 2
for i = 1:2
a(j,:)=circshift(a(j,:),[i 3]);
disp(a)
end
elseif b(j) == 3
for i = 1:3
a(j,:)=circshift(a(j,:),[i 2]);
disp(a)
end
end
有没有办法在3x6x12矩阵或(3 * 12)x6矩阵中得到我的结果?
答案 0 :(得分:0)
这样的递归函数怎么样:
function res = shift_all(a)
res = shift_recurse(a,1,[]);
function res = shift_recurse(a,r,existing)
res = existing;
m = a;
for i = 1:size(a,2)
if r < size(a,1)
res = shift_recurse(m, r+1, res);
elseif r == size(a,1)
res = cat(3, res, m);
end
m(r,:) = circshift(a(r,:),[1 i]);
end
调用res = shift_all(a)
会产生3x5x125的结果矩阵。