我有两个稀疏矩阵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);
答案 0 :(得分:2)
你不能使用
A = spfun(@exp, A-B);
因为对于A
B
相等的条目,您将获得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));
答案 1 :(得分:0)
修改强>
根据文档,spfun
只能输入两个输入:一个函数和一个一个稀疏矩阵。
所以你不能直接做你想做的事。最好的解决方案可能是评论中提出的建议,即:
res = spfun(@exp, A-B);
最好,