【问题标题】:How to change elements of a matrix with reference to a vector of column indices without using for-loop?如何在不使用for循环的情况下参考列索引向量更改矩阵元素?
【发布时间】:2016-09-21 09:48:50
【问题描述】:

我有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

我想用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 循环的情况下实现这一点?

【问题讨论】:

标签: arrays matlab matrix octave


【解决方案1】:

当然。您只需要从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

【讨论】:

  • 如果 b 是行向量,我该如何实现?
  • 什么意思? b is 在我的示例和您的问题中是行向量。你是说一个专栏吗?那么结果应该是什么?
  • 抱歉列向量。在实际情况下,“a”是大小为 5000x10 的矩阵,“b”是大小为 5000x1 的向量
  • @manoos 请参阅编辑。 b 现在可以是一行或一列。我假设 b 仍然包含 column 索引到 a
【解决方案2】:

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

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

【讨论】:

  • 如果 b 是行向量,我该如何实现?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多