假設我有一個高維向量v緻密且另一個高維向量x是稀疏的,我想要做的,看起來像在Matlab中添加稀疏矢量一片茂密的矢量
V = V的操作+ X
理想的情況下,因爲一個需要更新只能選擇v幾個條目這個操作應該是快,但它仍然是考慮的,甚至當我宣佈X是稀疏的時間量好。我試圖用v完全是以及V IN稀疏的形式,並且都是相當緩慢。
我也試圖通過調用查找,然後更新在原有的矢量循環來提取稀疏向量x的指數。這比上述操作更快,但是有一種方法可以用更少的代碼來實現。
感謝
假設我有一個高維向量v緻密且另一個高維向量x是稀疏的,我想要做的,看起來像在Matlab中添加稀疏矢量一片茂密的矢量
V = V的操作+ X
理想的情況下,因爲一個需要更新只能選擇v幾個條目這個操作應該是快,但它仍然是考慮的,甚至當我宣佈X是稀疏的時間量好。我試圖用v完全是以及V IN稀疏的形式,並且都是相當緩慢。
我也試圖通過調用查找,然後更新在原有的矢量循環來提取稀疏向量x的指數。這比上述操作更快,但是有一種方法可以用更少的代碼來實現。
感謝
從Matlab documentation(強調礦)報價:
二元運算產生稀疏的結果,如果兩個操作數都很少,如果兩個全部結果都滿了。對於混合操作數,除非操作保留稀疏性,否則結果將爲滿。 如果S是稀疏和F是滿的,則S + F,S * F和F \ S是滿的,而S. * F和S & F是稀疏的。在某些情況下,結果可能是,即使矩陣有幾個零個元素稀少。
因此,如果您想保留x
稀疏,我想使用邏輯索引更新v
與x
是最好的非零值。這裏是顯示無論是邏輯索引或明確full
-ing x
樣本函數最好(至少在我R2015a安裝):
function [] = blur()
n = 5E6;
v = rand(n,1);
x = sprand(n,1,0.001);
xf = full(x);
vs = sparse(v);
disp(['Full-Sparse: ',num2str(timeit(@() v + x) ,'%9.5f')]);
disp(['Full-Full: ',num2str(timeit(@() v + xf) ,'%9.5f')]);
disp(['Sparse-Sparse: ',num2str(timeit(@() vs + x) ,'%9.5f')]);
disp(['Logical Index: ',num2str(timeit(@() update(v,x)),'%9.5f')]);
end
function [] = update(v,x)
mask = x ~= 0;
v(mask) = v(mask) + x(mask);
end
感謝您的答覆。這相當快。在我的實驗中,比for循環方法更快,代碼更少。 – user1189053
這個問題也可能是有用的:設定的稀疏許多值快速路矩陣(http://stackoverflow.com/questions/32443031/fast-way-to-set-many-values-of-sparse-matrix/32443174) – Adriaan