Matlab:如何通过移动它的行来获取所有可能的不同矩阵(更新:每行有不同的步骤)

时间:2014-04-28 16:32:29

标签: matlab matrix

  

假设我有一个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矩阵中得到我的结果?

1 个答案:

答案 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的结果矩阵。