我想创建一个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
循环的情况下创建这样的矩阵?或者有任何最佳方式吗?
答案 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
可用于创建所需的矩阵。