2016-03-08 108 views
1

假設我有一個高維向量v緻密且另一個高維向量x是稀疏的,我想要做的,看起來像在Matlab中添加稀疏矢量一片茂密的矢量

V = V的操作+ X

理想的情況下,因爲一個需要更新只能選擇v幾個條目這個操作應該是快,但它仍然是考慮的,甚至當我宣佈X是稀疏的時間量好。我試圖用v完全是以及V IN稀疏的形式,並且都是相當緩慢。

我也試圖通過調用查找,然後更新在原有的矢量循環來提取稀疏向量x的指數。這比上述操作更快,但是有一種方法可以用更少的代碼來實現。

感謝

+0

這個問題也可能是有用的:設定的稀疏許多值快速路矩陣(http://stackoverflow.com/questions/32443031/fast-way-to-set-many-values-of-sparse-matrix/32443174) – Adriaan

回答

5

Matlab documentation強調礦)報價:

二元運算產生稀疏的結果,如果兩個操作數都很少,如果兩個全部結果都滿了。對於混合操作數,除非操作保留稀疏性,否則結果將爲滿。 如果S是稀疏和F是滿的,則S + F,S * F和F \ S是滿的,而S. * F和S & F是稀疏的。在某些情況下,結果可能是,即使矩陣有幾個零個元素稀少。

因此,如果您想保留x稀疏,我想使用邏輯索引更新vx是最好的非零值。這裏是顯示無論是邏輯索引或明確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 
+0

感謝您的答覆。這相當快。在我的實驗中,比for循環方法更快,代碼更少。 – user1189053