【问题标题】:Using spfun with two identically ordered sparse matrices将 spfun 与两个相同排序的稀疏矩阵一起使用
【发布时间】:2016-01-01 14:43:52
【问题描述】:

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

【问题讨论】:

标签: matlab matrix sparse-matrix


【解决方案1】:

你不能用

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

【讨论】:

    【解决方案2】:

    编辑

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

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

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

    最好的,

    【讨论】:

    • 抱歉这个错误的答案。我刚刚编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2010-11-22
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多