生成包含3个数字的矩阵

时间:2015-06-01 21:33:39

标签: matlab matrix

我正在尝试创建一个包含0s,1s和2s的8x8矩阵。每行和每列应包含两个0,三个1和三个2。

以前我使用下面的代码生成一个只包含1和0的示例。

output = zeros(8, 8);
for i=1:8
    tmp = (1:8) + (i); 
    tmp = rem(tmp, 4);
    output(i,:) = tmp;
    output(i,:) = tmp > 0;
end

output =

 1     1     0     1     1     1     0     1
 1     0     1     1     1     0     1     1
 0     1     1     1     0     1     1     1
 1     1     1     0     1     1     1     0
 1     1     0     1     1     1     0     1
 1     0     1     1     1     0     1     1
 0     1     1     1     0     1     1     1
 1     1     1     0     1     1     1     0

但是我现在想要类似于以下内容:

    output =

 1     1     0     1     2     2     0     2
 1     0     1     2     2     0     2     1
 0     1     2     2     0     2     1     1
 1     2     2     0     2     1     1     0
 2     2     0     2     1     1     0     1
 2     0     2     1     1     0     1     2
 0     2     1     1     0     1     2     2
 2     1     1     0     1     2     2     0

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您的示例中的内容是Hankel matrix,因此您可以使用hankel函数

c = [1  1  0  1  2  2  0  2];
k = [2  1  1  0  1  2  2  0];
A = hankel(c,k)

其中c是输出矩阵的第一列,k是最后一行。

使输出矩阵成为Hankel矩阵是一个好主意(根据您的要求),因为它会强制每个值的行列频率计数。您不一定只是通过创建基行行的随机排列行(例如,使用randperm)来获得这一点,因为可能会出现重复行,这会破坏您的列要求。

例如,如果您希望随机c具有固定数量的特定元素,您可以随机置换包含所需值和频率的基本向量 - 根据您的要求,这将是

c = [0 0 1 1 1 2 2 2];
index = randperm(numel(c));
c = c(index);

c =

   0   2   0   2   2   1   1   1

要获得方形Hankel结构,请选择k作为c的下一个循环排列

k = circshift(c',1)'

k =

    1   0   2   0   2   2   1   1

如上所述,只需拨打hankel

即可
A = hankel(c,k)

A =

   0   2   0   2   2   1   1   1
   2   0   2   2   1   1   1   0
   0   2   2   1   1   1   0   2
   2   2   1   1   1   0   2   0
   2   1   1   1   0   2   0   2
   1   1   1   0   2   0   2   2
   1   1   0   2   0   2   2   1
   1   0   2   0   2   2   1   1

以上输出基于我在机器上根据randperm的输出得到的结果。

使用上述方法生成的任何输出矩阵都将满足您在问题中指定的要求。