我正在尝试创建一个包含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
感谢您的帮助。
答案 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
的输出得到的结果。
使用上述方法生成的任何输出矩阵都将满足您在问题中指定的要求。