将 spfun 与两个相同顺序的稀疏矩阵一起使用
Using spfun with two identically ordered sparse matrices
我有两个稀疏矩阵 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 中收到错误提示:"Too many input arguments."
谁能建议一种有效的计算方法?
应该计算很多次。
谢谢!
编辑:mikkola 建议 A = spfun(@f,A-B)
这解决了问题,但问题仍然是如何使用无法使用相同技巧解决的两个变量的函数来完成此操作。例如:
g = @(x,y) x.*cos(y);
A = spfun(@g,A,B);
编辑
根据文档,spfun
只能接受两个输入:一个函数和 一个 稀疏矩阵。
所以你不能直接做你想做的事。最好的解决方案可能是评论中所建议的,即:
res = spfun(@exp, A-B);
最佳,
你不能使用
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));
我有两个稀疏矩阵 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 中收到错误提示:"Too many input arguments." 谁能建议一种有效的计算方法? 应该计算很多次。
谢谢!
编辑:mikkola 建议 A = spfun(@f,A-B)
这解决了问题,但问题仍然是如何使用无法使用相同技巧解决的两个变量的函数来完成此操作。例如:
g = @(x,y) x.*cos(y);
A = spfun(@g,A,B);
编辑
根据文档,spfun
只能接受两个输入:一个函数和 一个 稀疏矩阵。
所以你不能直接做你想做的事。最好的解决方案可能是评论中所建议的,即:
res = spfun(@exp, A-B);
最佳,
你不能使用
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));