Arrays 如何在不使用for循环的情况下,根据列索引向量更改矩阵元素?

Arrays 如何在不使用for循环的情况下,根据列索引向量更改矩阵元素?,arrays,matlab,matrix,octave,Arrays,Matlab,Matrix,Octave,我有一个矩阵 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 和bvector b = 1 2 3 4 5 5 我想用b矩阵值的参考值替换a矩阵中每一行的值,并最终生成如下矩阵,而不使用for循环 a_new = 1 0 0 0

我有一个
矩阵

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
vector

b =

   1   2   3   4   5   5
我想用
b
矩阵值的参考值替换
a
矩阵中每一行的值,并最终生成如下矩阵,而不使用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循环的情况下实现此功能?

当然。您只需要从
b
构建一个,并使用它填充
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

这些方法中的任何一种都适用于倍频程:

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

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

也可以通过下标到指数的转换方式

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
与相同,但使用专用功能:


如果b是行向量,我如何实现相同的功能?你的意思是什么<在我的示例和您的问题中,code>b
是行向量。你是说专栏吗?那么结果应该是什么呢?对不起,列向量。在实际情况中,“a”是大小为5000x10的矩阵,“b”是大小为5000x10的向量5000x1@manoos请参见编辑<代码>b
现在可以是行或列。我假设
b
仍然包含
a
中的列索引,如果b是行向量,如何实现相同的索引?可能重复
a( sub2ind(size(a),(1:numel(b)).',b(:)) ) = 1