我想在维度A
的Matlab中构建一个矩阵w x (m*w)
,其中
除了m
连续ones
之外,每一行都是零,当我们向下移动到行时,它会向右侧移动。
很少有例子可以澄清
w=3,m=4
A=[1 1 1 1 0 0 0 0 0 0 0 0;
0 0 0 0 1 1 1 1 0 0 0 0;
0 0 0 0 0 0 0 0 1 1 1 1]
或
w=3, m=3
A=[1 1 1 0 0 0 0 0 0;
0 0 0 1 1 1 0 0 0;
0 0 0 0 0 0 1 1 1]
或
w=2, m=3
A=[1 1 1 0 0 0;
0 0 0 1 1 1]
我看不清楚如何继续,任何提示都会非常有帮助。
答案 0 :(得分:6)
如果您编写“修改后的对角线矩阵”,您会将其视为行向量,它将始终如下所示
% 1 ... 1 0 ... ... 0 ... ... ... ... ... ... ... ... 1 ... 1
% m ones m*w zeros w-1 times the same as before m ones
m
个向量,后跟m*w
个零; w
次,MATLAB已经知道https://xyz.123.com/artifactory/bx-test; 一旦理解了上述步骤,即使使用单行
也可以实现最终行为>> m = 4; w = 3;
>> vec2mat([repmat([ones(1, m) zeros(1, m*w)], 1, w-1) ones(1, m)], w*m)
ans =
1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1
这是真的,因为循环不再那么慢了。我计算了我的单行解决方案,简单的for循环和how to do this与eye()
和repelem()
。
点击图片进行缩放
使用MATLAB R2018a在同一台机器上测试。
正如您所看到的,只要m
和w
非常小,即使您可以指出速度上的某些差异,它们也不会被人类注意到。
无论如何,如果你打算使用更大的矩阵,很明显哪种解决方案是最好的。
答案 1 :(得分:4)
以下是一些方法:
A = repelem(eye(w), 1, m);
使用eye
并编制索引:
A = eye(w);
A = A(1:w, ceil(1/m:1/m:w));
使用eye
和kron
:
A = kron(eye(w), ones(1,m));
A = bsxfun(@eq, (1:m).', ceil(1/m:1/m:w)); % Or A = (1:m).'==ceil(1/m:1/m:w);