algorithm - 判断矩阵是否稀疏?

标签 algorithm matlab matrix

我有一个矩阵。我想知道它是否稀疏。 matlab 中是否有任何函数可以评估该属性?我尝试使用 issparse 函数,但它总是返回 0(不稀疏)。例如,我的矩阵 (27 x 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]

这是上面矩阵的图

enter image description here

最佳答案

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

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

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

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

numel确定矩阵 Annz 中的元素总数确定非零元素的总数。因此,numel(A) - nnz(A) 应该给出零元素的总数。

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

is_sparse = sparsity > tol;

tol 将是 [0,1] 的分数,因此类似 0.75 的东西可以工作。这意味着如果矩阵的 75% 由零组成,则这可能是一个稀疏矩阵。虽然这都是启发式的。选择您认为最合理的阈值。

关于algorithm - 判断矩阵是否稀疏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664291/

相关文章:

java - Weka 的 PCA 运行时间太长

matlab - 试试……终于等同于 Matlab

c++ - 使用文件将 C++ 数组转换为 matlab 大矩阵

java - 递归查找二维矩阵中的元素

python - numpy 中的超对角非方矩阵?

具有快速查找/插入/删除功能的循环缓冲区

java - Java中高效实用的flood fill算法?

java - 使用计数器的 Douglas Peucker 算法

matlab - 我可以在不运行 MATLAB 的情况下使用 MATLAB 编辑器吗?

matlab - 旋转 3-D Matlab 图时保持对象大小不变