将spfun与两个同序稀疏矩阵结合使用



我得到了两个稀疏矩阵A和B,它们具有相同的稀疏性模式(所有非零都位于完全相同的位置):

i = randi(1000,[50,1]);
j = randi(1000,[50,1]);
a = rand(50,1);
b = rand(50,1);
A = sparse(i,j,a,1000,1000);
B = sparse(i,j,b,1000,1000);

我想只对非零有效地计算exp(A-B),并将其保存回A中。我试着用spfun来完成这个任务:

f = @(x,y) exp(x-y);
A = spfun(f,A,B);

但我在spfun中遇到了一个错误:"输入参数太多了。"有人能提出一种有效的计算方法吗?它应该计算多次。

谢谢!

编辑:mikkola建议使用A = spfun(@f,A-B)来解决这个问题,但问题仍然是如何使用两个变量的函数来解决,而使用相同的技巧是无法解决的。例如:

g = @(x,y) x.*cos(y);
A = spfun(@g,A,B);

您不能使用

A = spfun(@exp, A-B);

因为对于AB相等的条目,您将得到0而不是1

为了解决这个问题,你可以计算非零分量的指数向量,然后根据它构建一个稀疏矩阵:

A = sparse(i,j,exp(nonzeros(A)-nonzeros(B))); %// if you have i, j stored

A(find(A)) = exp(nonzeros(A)-nonzeros(B));

编辑

根据文献,spfun只能接受两个输入:一个函数和一个稀疏矩阵。

所以你不能直接做你想做的事。最好的解决方案可能是评论中建议的,

res = spfun(@exp, A-B);

最佳,