【发布时间】:2014-10-27 20:30:24
【问题描述】:
我有 2 个变量...输入的数量 N 和历史 M 的长度。这两个变量决定了矩阵 V 的大小,即 n x m,即 n 行 m 列。
我很难想出一种算法,使我能够生成一定数量的排列(或序列,你认为合适的)。
如果有人可以在 Matlab 中帮助我提供算法,我将非常高兴,但伪算法也非常好。
我举三个例子:
- 如果输入数为 N = 1,历史长度为 M = 2,则我有 (M+1)^N 个不同的组合,在本例中为 3。排列为:
(如果您不熟悉 matlab 矩阵表示法,, 分隔列,; 分隔行。)
V(1) = [1,0,0]
V(2) = [0,1,0]
V(3) = [0,0,1]
- 如果输入数为 N = 2,历史长度为 M = 2,我有 (M+1)^N 个不同的组合,在本例中为 9。
排列是:
V(1) = [1,0,0; 1,0,0]
V(2) = [1,0,0; 0,1,0]
V(3) = [1,0,0; 0,0,1]
V(4) = [0,1,0; 1,0,0]
V(5) = [0,1,0; 0,1,0]
V(6) = [0,1,0; 0,0,1]
V(7) = [0,0,1; 1,0,0]
V(8) = [0,0,1; 0,1,0]
V(9) = [0,0,1; 0,0,1]
- 如果输入数为 N = 3,历史长度为 M = 3,我有 (M+1)^N 个不同的组合,在本例中为 64。
排列是:
V(1) = [1,0,0,0; 1,0,0,0; 1,0,0,0]
V(2) = [1,0,0,0; 1,0,0,0; 0,1,0,0]
V(3) = [1,0,0,0; 1,0,0,0; 0,0,1,0]
V(4) = [1,0,0,0; 1,0,0,0; 0,0,0,1]
V(5) = [1,0,0,0; 0,1,0,0; 1,0,0,0]
...
V(8) = [1,0,0,0; 0,1,0,0; 0,0,0,1]
V(9) = [1,0,0,0; 0,0,1,0; 1,0,0,0]
...
V(16) = [1,0,0,0; 0,0,0,1; 0,0,0,1]
V(17) = [0,1,0,0; 1,0,0,0; 1,0,0,0]
...
V(64) = [0,0,0,1; 0,0,0,1; 0,0,0,1]
编辑:我刚刚找到了一种方法来生成非常大的矩阵 W,其中每一行代表 V(i)
对于第一种情况:
W = eye(3)
这里eye(k)创建一个大小为k x k的单位矩阵
对于第二种情况:
W = [kron(eye(3), ones(3,1)), ...
kron(ones(3,1), eye(3))]
这里kron是大小为k x l的kronecker product和ones(k,l)creates a matrix with ones
对于第三种情况:
W = [kron(kron(eye(4), ones(4,1)), ones(4,1)), ...
kron(kron(ones(4,1), eye(4)), ones(4,1)), ...
kron(kron(ones(4,1), ones(4,1)), eye(4))]
现在我们已经创建了矩阵 W,其中每一行以向量形式表示 V(i),V(i) 还不是矩阵。
观察两件事:
- 当输入 N 增加时,一个额外的列会添加一个额外的克罗内克积,并且单位矩阵会沿着向量移动。
- 当历史 M 的长度增加时,单位矩阵向量也会增加,例如 eye(4) -> eye(5)、ones(4,1) -> one(5,1)。
【问题讨论】:
-
算法还是你只需要一个产生结果的函数?并且是
V向量以重要的顺序返回(即,[1 0 0]在[0 1 0]之前,反之亦然)。
标签: algorithm matlab matrix permutation