2016-03-08 106 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