如何在不使用for-loop的情况下参考列索引的向量来更改矩阵的元素?

时间:2016-09-21 09:48:51

标签: arrays matlab matrix octave

我有a矩阵

a =

   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0

b向量

b =

   1   2   3   4   5   5

我想用a矩阵值的参考值替换b矩阵中每一行的值,最后生成一个矩阵,如下所示,而不使用for循环。

a_new =

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

如果b, b(1) = 1的第一个元素如此更改,则取a向量的第一行,并将第一个元素设为1,因为b(1) = 1

如何在不使用for循环的情况下实现此目的?

4 个答案:

答案 0 :(得分:3)

不确定。您只需要从b构建linear index并使用它来填充a中的值:

a = zeros(6,5); % original matrix
b = [1 2 3 4 5 5]; % row or column vector with column indices into a
ind = (1:size(a,1)) + (b(:).'-1)*size(a,1); % build linear index
a(ind) = 1; % fill value at those positions

答案 1 :(得分:2)

Luis Mendo's answer相同,但使用专用函数sub2ind

a( sub2ind(size(a),(1:numel(b)).',b(:)) ) = 1

答案 2 :(得分:1)

也可以通过下标到索引转换方式,

a = zeros(6,5);
b = [1 2 3 4 5 5];
idx = sub2ind(size(a), [1:6], b); % 1:6 just to create the row index per b entry
a(idx) = 1

答案 3 :(得分:0)

这些方法中的任何一种都适用于Octave:

bsxfun(@eq,  [1:5 5]',(1:5))

[1:5 5].' == (1:5)