【问题标题】:Addition through linear indexing通过线性索引添加
【发布时间】:2012-11-15 23:40:17
【问题描述】:

我有一个 256 x 256 的矩阵 M,并产生了一些线性索引 L。

我还有一个权重向量,其数量与 L 相同,要添加到由 L 索引的 M 的元素中。 问题是,用表达式

M(L) = M(L) + weights;

对于L中的重复值,只会添加weights中最后一个对应的元素。

有没有一种简单的方法来解决这个问题/我错过了什么?

【问题讨论】:

  • 你写的伪代码对我有用。请注意不要在之前的某处覆盖weightsL...
  • @nate 尝试运行这个:X = [1; 1]; L = [1 1 2]; W = 10 * ones(length(L), 1); X(L) = X(L) + W;。我认为 OP 试图获得的行为是X 应该以等于21 的第一个元素和等于11 的第二个元素结束。但是我提供的代码产生的两个元素都等于11。有趣的问题!干杯。
  • @ColinTBowers 是的,那个。是否有一种解决方法,也许用 unique() 来总结所有相关元素?

标签: matlab indexing octave addition


【解决方案1】:

我认为这里的方法是使用 accumarray:

% The 'data'
M = zeros(10,5); % Suppose this is your matrix
L = [46 47 47 46 48 49 48 48 48]'; % The linear index numbers
weights = [4 7 4 6 4 9 48 8 48]'; % The weights for these index numbers

% Make sure the indices are in ascending order
Y = SORTROWS([L weights]);

% Determining the weights to be added
idx = unique(Y(:,1));
weights_unique = accumarray(Y(:,1),Y(:,2));

% The addition
M(idx) = M(idx) + weights_unique(weights_unique>0);

【讨论】:

  • 哇,就是这样。我一直在尝试手动制作,没有 for 循环,我越来越绝望了。非常感谢!
  • 我已经更新了答案,以确保如果您的索引没有提前排序,它也可以工作。
  • 是否有任何理由导致权重长度和唯一(索引)不匹配?
  • 是的,如果您的L[3 3 2 2 2 1],我的原始代码将失败,因为unique 包含排序步骤,但accumarray 没有。
  • @DennisJaherudin 我正在尝试将 accumarray 用于两个相同大小的向量 L,W。即使进行排序,我最终也会得到不同的数字,用于唯一(L)和 accumarray 的结果。不过,用其他伙伴向量测试 L 和 W 是可行的。有什么建议吗?
猜你喜欢
  • 2011-12-10
  • 2021-04-12
  • 2013-02-20
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2012-05-13
  • 2011-01-11
  • 2012-03-23
相关资源
最近更新 更多