具有遵循特定规则的1和0的MxN矩阵

时间:2016-11-05 12:26:53

标签: matlab matrix

我想创建一个MxN矩阵,如下所示:

[1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0;
 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0;
 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0;
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0;
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1]

我有窗口大小,比方说,5,每行移动3。是否可以在不使用for循环的情况下创建这样的矩阵?或者有任何最佳方式吗?

1 个答案:

答案 0 :(得分:0)

这是一个单行解决方案:

reshape([reshape([ones(5,6);zeros(21,6)], 1,[]), ones(1,5)],[],7).'

请注意:

所需的矩阵可以看作是[6, 5+21]矩阵的连接:

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

[1 ,5]矩阵:

1 1 1 1 1

重塑为[7 , 23]矩阵。

使用repelem + bsxfun + accumarray的其他解决方案:

r = repelem (1:7,5);
c= bsxfun(@plus, ((1:5)-3).',3*(1:7));
out = accumarray([r(:) c(:)] ,1)

可以生成1 s的行和列索引,accumarray可用于创建所需的矩阵。