2016-01-01 23 views
3

我有两个稀疏矩阵A和B,其具有相同的稀疏模式(所有非零元素是在完全相同的位置):使用spfun与两个相同有序稀疏矩阵

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

我想计算有效实验值(AB)只为非零,并将其保存回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); 
+3

综观[文档】( http://se.mathworks.com/help/matlab/ref/spfun.html),我想你应该用'spfun(@exp,AB)'来代替。 – mikkola

回答

2

不能使用

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)); 
0

编辑

根据文档,spfun只能取两个输入:一个功能和一个稀疏矩阵。

所以你不能直接做你想做的事情。最好的解决办法可能是什么在评论中有人建议,

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

最佳,

+0

对不起,这个错误的答案。我刚刚编辑了我的答案。 – Ratbert