使用带有两个相同排序的稀疏矩阵的spfun

时间:2016-01-01 14:43:53

标签: matlab matrix sparse-matrix

我有两个稀疏矩阵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);

2 个答案:

答案 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);

最好,