线性索引的加法

3

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

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

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

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

是否有简单的解决方法/我是否漏掉了什么?


你写的伪代码对我有效。请确保在其他地方没有覆盖“weights”或“L”... - bla
@nate 试着运行这段代码:X = [1; 1]; L = [1 1 2]; W = 10 * ones(length(L), 1); X(L) = X(L) + W;。我认为 OP 想要实现的行为是 X 的第一个元素等于 21,第二个元素等于 11。但是我提供的代码却使得两个元素都等于 11。这是一个有趣的问题!祝好运。 - Colin T Bowers
@ColinTBowers 是的,就是那个。 也许可以使用 unique() 方法来总结所有相关元素,从而找到一种解决方法? - Temp
1个回答

2
我认为这里的方法是使用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);

哇,正是如此。我一直在尝试手动完成这个任务,而且没有使用循环语句,我已经绝望了。非常感谢! - Temp
生成的权重长度和唯一索引(indices)的不匹配是否有任何原因? - Temp
是的,如果您的 L[3 3 2 2 2 1],我的原始代码将失败,因为 unique 包括排序步骤,但 accumarray 不包括。 - Dennis Jaheruddin
我正在尝试使用accumarray函数处理两个相同大小的向量L和W。即使进行了排序,我仍然得到unique(L)和accumarray结果中不同的numels。但是,使用其他伙伴向量测试L和W却可以正常工作。你有什么建议吗? - Temp
显然,只有在使用了所有索引时它才有效,我现在已经更新它以匹配您的向量。 - Dennis Jaheruddin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接