【问题标题】:Manipulating sparse matrices in Matlab在 Matlab 中处理稀疏矩阵
【发布时间】:2013-03-02 10:40:45
【问题描述】:

假设我有一个稀疏矩阵Sparstica,它是几个其他稀疏矩阵的垂直串联。当我输入Sparstica(:) 时,我得到一个非零元素的列表。左列是元素的索引,右列是非零元素。

如何操作中间n-2 块(总共n 稀疏块矩阵)中每隔一个稀疏块矩阵的第i 个和第j 个非零元素?


附加:为了澄清我所说的每个其他稀疏矩阵的第 i 个和第 j 个元素的意思,假设我有

Sparstica = [A_1; A2; A_3; ... ; A_n]

这是从vertcat 创建的。现在我需要从A_2A_{N-1}每隔一个稀疏矩阵的第i个和第j个非零元素(我知道这个符号实际上不允许,但仅用于演示目的)。如果可能的话,我想使用for循环来完成这个。

【问题讨论】:

  • n 在您的情况下有多大?你有没有检查过使用for-loops 确实太慢了?
  • mathworks.com/help/matlab/math/… ctrl+f "加剧效率低下"。对于我的目的,n 可以达到 2^15 左右。我忘记了 Matlab 在我的机器上可以处理的上限是多少。

标签: matlab indexing block sparse-matrix


【解决方案1】:

你可以使用find找到非零元素:

>> A = speye(3)

A =

   (1,1)        1
   (2,2)        1
   (3,3)        1

>> I = find(A ~= 0)

I =

     1
     5
     9

如果您需要行/列格式的索引,请使用ind2sub:

>> [X, Y] = ind2sub(size(A), I)

X =

     1
     2
     3

Y =

     1
     2
     3

【讨论】:

  • 你知道如何在不使用 for 循环的情况下操作其他每个稀疏矩阵的第 i 个和第 j 个元素吗?
  • 你能用“每个其他稀疏矩阵的相同的第 i 个和第 j 个元素”澄清你的意思吗?
  • 我想了一会儿,但我想不出不使用 for 循环的东西。如果这对您的代码至关重要,并且如果标准 MATLAB for 循环太慢,那么我建议在组装大稀疏矩阵之前执行这些操作,或者使用 MEX 函数执行循环。
  • 关于find 的旁注:请求两个输出直接产生行列,例如,[X,Y]=find(A) 产生X=[1;2;3],Y=[1;2;3] 代替ind2sub(size(A),find(A))。第三个输出也给你价值;有关更多信息,请参阅 MATLABGNU Octave 文档。
猜你喜欢
  • 2019-02-23
  • 2013-04-11
  • 1970-01-01
  • 2017-07-02
  • 2012-06-20
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多