我有一個矩陣A,一個索引is和js串列,以及一個要添加到的值串列A,ws。最初我只是通過A嵌套的 for 回圈進行迭代:
for idx = 1:N
i = is(idx);
j = js(idx);
w = ws(idx);
A(i,j) = A(i,j) w;
end
但是,我想對其進行矢量化以提高效率。我想一些簡單的事情
A(is,js) = A(is,js) ws
會起作用,只要 is 和 js 不重復就可以了。換句話說,如果我生成idx = sub2ind(size(A),is,js);,只要idx沒有重復值,一切都很好。如果是這樣,則僅添加最后一個值,所有先前的值都將被忽略。一個具體的例子:
A = zeros(3,3);
indices = [1,2,3,1];
additions = [5,5,5,5];
A(indices) = A(indices) additions;
這導致第一列的值為 5,而不是 5、5、10。
這是一個小例子,但在我的實際應用程式中,索引串列非常長并且充滿了冗余值。我希望將其矢量化以節省時間,因此通過和消除冗余并不是一個真正的選擇。所以我的主要問題是,如何從一組給定的冗余索引中添加到矩陣中?或者,是否有另一種方法可以在沒有任何迭代的情況下解決這個問題?
uj5u.com熱心網友回復:
強調accumarray(accumarray實際上適用于兩個索引)
以 Luis Mendo 為例:
is = [2 3 3 1 1 2].';
js = [1 3 3 2 2 4].';
ws = [10 20 30 40 50 60].';
A3 = accumarray([is js],ws);
%% A3 =
%% 0 90 0 0
%% 10 0 0 60
%% 0 0 50 0
uj5u.com熱心網友回復:
如果我理解正確,您只需要full(sparse(is, js, ws)). 這是有效的,因為在匹配索引處sparse 累積值。
% Example data
is = [2 3 3 1 1 2];
js = [1 3 3 2 2 4];
ws = [10 20 30 40 50 60];
% With loop
N = numel(is);
A = zeros(max(is), max(js));
for idx = 1:N
i = is(idx);
j = js(idx);
w = ws(idx);
A(i,j) = A(i,j) w;
end
% With `sparse`
A2 = full(sparse(is, js, ws));
% Check
isequal(A, A2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/496738.html
上一篇:帶有導航圖示顫動的水平串列
