假设我有一个高维向量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