【问题标题】:Determine whether matrix is sparse?判断矩阵是否稀疏?
【发布时间】:2015-04-16 02:22:23
【问题描述】:

我有一个矩阵。我想知道它是否稀疏。 matlab 中是否有任何函数来评估该属性?我尝试使用issparse 函数,但它总是返回0(不稀疏)。比如我的矩阵(27 by 27)

A=
  [ 1   0   0   0   0   1   1   1   0   0   1   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0
    1   1   0   0   0   0   1   0   1   0   0   1   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0
    1   1   1   0   0   0   0   1   0   1   0   0   1   0   0   0   0   0   0   1   1   0   0   0   0   0   0
    0   1   1   1   0   0   0   0   1   0   0   0   0   1   0   0   0   0   0   0   1   1   0   0   0   0   0
    0   0   1   1   1   0   0   1   0   1   0   0   0   0   1   0   0   0   0   0   0   1   1   0   0   0   0
    0   0   0   1   1   1   0   0   1   0   0   0   0   0   0   1   0   0   0   0   0   0   1   1   0   0   0
    0   0   0   0   1   1   1   0   0   1   0   0   0   0   0   0   1   0   0   0   0   0   0   1   1   0   0
    250 243 247 245 244 244 244 122 61  144 72  36  18  9   4   2   1   1   0   0   0   0   0   0   0   0   0
    151 197 236 118 181 212 106 53  26  13  136 68  34  17  8   4   2   0   1   0   0   0   0   0   0   0   0
    24  12  6   3   143 201 234 117 180 90  45  152 76  38  19  9   4   0   0   1   0   0   0   0   0   0   0
    18  9   138 69  172 86  165 220 224 112 56  28  128 64  32  16  8   0   0   0   1   0   0   0   0   0   0
    27  131 207 103 189 94  47  153 194 239 119 59  29  128 64  32  16  0   0   0   0   1   0   0   0   0   0
    44  22  133 204 232 116 58  147 199 237 248 124 62  31  129 64  32  0   0   0   0   0   1   0   0   0   0
    238 119 181 90  45  152 76  38  19  135 205 232 116 58  29  128 64  0   0   0   0   0   0   1   0   0   0
    48  24  12  6   3   143 201 100 50  25  130 207 233 116 58  29  128 0   0   0   0   0   0   0   1   0   0
    168 84  42  21  132 66  33  158 79  39  19  135 205 232 116 58  29  0   0   0   0   0   0   0   0   1   0
    235 117 58  29  128 64  32  16  8   4   2   1   142 201 234 117 58  0   0   0   0   0   0   0   0   0   1
    0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   1   0   0   0   0   1   0   0   0
    0   1   1   0   0   0   0   1   1   0   0   0   1   1   1   0   0   0   0   0   1   1   0   0   0   0   0
    1   1   1   1   1   1   1   1   0   1   1   1   1   1   0   1   1   1   1   0   0   0   0   0   0   0   0
    0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   1   0   0   0   0   1   0
    0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   1   1
    0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0   0   1   0   0   1   0   0
    0   0   0   0   0   1   0   0   0   1   0   0   0   1   0   0   0   0   0   1   0   0   1   0   0   0   1
    0   0   0   0   0   0   1   0   0   0   0   0   1   0   0   0   0   0   0   1   0   0   1   0   0   0   0
    0   0   0   0   1   0   0   0   0   1   0   0   0   0   0   0   1   1   0   0   1   0   0   0   0   1   0
    0   0   1   0   0   1   0   0   1   0   0   1   0   0   1   0   1   0   0   0   0   1   1   0   0   0   0]

这是上面矩阵的图

【问题讨论】:

  • issparse 检查是否使用sparse 类创建了矩阵。它不评估矩阵的稀疏性。
  • 那么,有什么函数可以判断矩阵是否稀疏?
  • 对于您的目的而言,稀疏有多稀疏?
  • 稀疏矩阵的计算速度比普通矩阵快。我想开发一个稀疏矩阵的算法,但是,首先,我必须检查它是否稀疏
  • 稀疏不是一个唯一定义的概念。告诉我们您的算法究竟需要什么。

标签: algorithm matlab matrix


【解决方案1】:

这个看似简单的问题其实很难回答。实际上没有已知的标准来确定一个矩阵是稀疏的还是满的。

但是,我知道的最常见的度量是度量矩阵的sparsity。这只是零的总数与元素总数的比例。如果这超过了某个合理的阈值,那么您可以说矩阵是稀疏的。

如果给定矩阵A,可能是这样的:

sparsity = (numel(A) - nnz(A)) / numel(A);

numel 确定矩阵A 中的元素总数,nnz 确定非零元素的总数。因此,numel(A) - nnz(A) 应该为您提供零元素的总数。

所以,按照阈值的想法,这就是我所说的:

is_sparse = sparsity > tol;

tol 将是[0,1] 的一小部分,所以像0.75 这样的东西可以工作。这意味着如果 75% 的矩阵由零组成,这可能是一个稀疏矩阵。不过,这都是启发式的。选择一个您认为最有意义的阈值。

【讨论】:

  • 有任何纸张显示 tol 大于 0.75?因为当我们写论文时,我们想表明它是否稀疏。我们必须引用标准或论文。感谢 rayryeng​​span>
  • 没有纸。正如我所说,这都是启发式的。
  • @user8264“稀疏”的稀疏程度取决于矩阵。来自 WolframMathWorld:“一个矩阵需要多少个零才能被认为是“稀疏”的,这取决于矩阵的结构和对其执行的所需操作。例如,随机生成的稀疏 n×n 矩阵,其中 cn 个条目分散在 Wilkinson 的意义上(对于直接方法),随机整个矩阵并不稀疏,因为它需要 O(n^3) 时间来分解(概率高且 c 足够大;Gilbert et al. 1992)。 mathworld.wolfram.com/SparseMatrix.html
  • @user8264 考虑 Matlab 使用额外的nnz + 列数内存来表示稀疏矩阵的事实,因此如果numel(A) - nnz(A) < nnz(A) + size(A,2) 则将其存储为sparse 更节省内存在 Matlab 中。
  • @user8264 - 没有错。只是定义不同而已。请记住,这都是启发式的。没有定义矩阵是否稀疏的黄金标准......所以一个定义可能会告诉您它是稀疏的,而另一个则不是。我想不出任何适用于所有情况的定义......所以您可能需要回过头来问自己为什么要对矩阵是否稀疏进行分类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2011-06-05
  • 2019-07-31
  • 1970-01-01
相关资源
最近更新 更多