我想以矢量化的方式基于矢量值替换矩阵的第n列的值。
输入:
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
矢量:
[2]
[4]
[1]
[3]
预期产出:
[0 1 0 0]
[0 0 0 1]
[1 0 0 0]
[0 0 1 0]
带有for循环的Matlab代码:
A = zeros(4,4);
b = [2; 4; 1; 3];
for row=1:4
A(row, b(row)) = 1;
endfor
matlab代码与sub2ind:
A = zeros(4,4);
b = [2; 4; 1; 3];
c = [[1:length(b)]' b];
A(sub2ind(size(A), c(:,1), c(:,2))) = 1;
Matlab中有更多的矢量化方式吗?谢谢。
答案 0 :(得分:1)
您可以使用sub2ind
的原始版本以矢量化方式解决它 -
A( (b(:)-1)*size(A,1) + [1:numel(b)]' ) = 1;
工作原理:由于b
的元素是列索引而MATLAB遵循列主索引,因此我们需要将每个此类列索引与{中的行数相乘{1}}在启动该列之前获取元素数量,即A
。然后,添加相应的行索引,即(b(:)-1)*size(A,1)
,以给出最终的线性索引,与[1:numel(b)]'
生成的索引相同。最后,使用这些线性索引将sub2ind
索引,并根据问题的要求将其设置为所有A
。