Matlab 通过线性索引进行加法

Matlab 通过线性索引进行加法,matlab,indexing,octave,addition,Matlab,Indexing,Octave,Addition,我有一个256 x 256的矩阵M,并产生了一些线性索引L 另外,我还有一个权重向量,与L相同的整数,要添加到M的元素中,由L索引。 问题是,这个表达式 M(L) = M(L) + weights; 对于L中的重复值,将只添加权重中最后一个对应的元素 有没有一个简单的方法来解决这个问题/我是否遗漏了什么?我认为解决这个问题的方法是使用accumarray: % The 'data' M = zeros(10,5); % Suppose this is your matrix L = [46 4

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

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

M(L) = M(L) + weights;
对于L中的重复值,将只添加权重中最后一个对应的元素


有没有一个简单的方法来解决这个问题/我是否遗漏了什么?

我认为解决这个问题的方法是使用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);

你写的伪代码对我有用。在…@nate尝试运行以下命令之前,请确保不要覆盖
权重
L
:;L=[12];W=10*1(长度(L),1);X(L)=X(L)+W。我认为OP试图获得的行为是
X
应该以第一个元素等于
21
和第二个元素等于
11
结束。但是我提供的代码生成的两个元素都等于
11
。有趣的问题!干杯。@ColinTBowers是的,那个。有没有一种变通方法,可能是使用unique()来汇总所有相关元素?哇,正是这样。我一直在尝试手动完成此操作,而不使用for循环,我感到非常绝望。非常感谢!我已经更新了答案,以确保如果您的索引没有提前排序,它也会起作用。是否有任何原因导致结果权重长度和唯一性(索引)不匹配?是的,如果您的
L
将是
[3 3 2 2 1]
我的原始代码将失败,因为
唯一性
包括排序步骤,但是
Accumaray
没有。@DennisJaherudin我试图对两个相同大小的向量L,W使用accumarray。即使使用排序,我最终也会对唯一(L)和accumarray的结果使用不同的NUMEL。不过,与其他伙伴向量一起测试L和W是可行的。有什么建议吗?