小编nis*_*pio的帖子

spfun遇到bsxfun的地方

有没有办法执行像元素一样的bsxfun操作,但只能操作稀疏矩阵的非零元素?

特别是,对于A位置(i,j)I 中矩阵中的每个非零元素,我希望找到i第 - 行中除了元素之外的所有非零元素的乘积(i,j).

例如,如果i-th行如下所示:

0   5   3   0   0   4   0  0
Run Code Online (Sandbox Code Playgroud)

结果应如下所示:

0   12  20  0   0   15  0  0
Run Code Online (Sandbox Code Playgroud)

最明显的解决方案似乎是沿每行采用非零元素的乘积,然后将每个元素从行产品中分离出来.因此,在上面的例子中,行产品是5 x 3 x 4 = 60,然后我只是分开5 34在各自的位置.

给定一个稀疏矩阵A,这是我迄今为止最好的解决方案:

[M N] = size(A);
[row col vals] = find(A);
row_prod = accumarray(row,vals,[],@prod);
B = bsxfun(@ldivide, A, row_prod);
B = sparse(row,col,B(sub2ind([M N],row,col)),M,N);
Run Code Online (Sandbox Code Playgroud)

前三行实现了我想要的:一个列向量,表示每行非零元素的乘积.但是,最后两行存在很多问题.

  • bsxfun 将返回一个非稀疏矩阵的大小 A
  • 这会浪费很多不必要的循环除以零. …
  • matlab

    5
    推荐指数
    1
    解决办法
    323
    查看次数

    标签 统计

    matlab ×1