【问题标题】:Thresholding a huge matrix to avoid overuse of memory, C++对一个巨大的矩阵进行阈值处理以避免过度使用内存,C++
【发布时间】:2013-09-22 12:41:48
【问题描述】:

我想生成一个巨大的加权无向图,由一个巨大的邻接矩阵 AJM 表示。所以对于 i 和 j 的循环,

AJM[i][j] = AJM[j][i]

AJM[i][i] = 0

权重在区间内生成为随机双数,例如 [0.01, 10.00]。如果我有 10k 个顶点,那么矩阵将是 10k x 10k 的双类型条目,如果我存储它,这将是内存中的一大块。

现在我想为想要的边数设置一个阈值 E,并忽略所有权重大于某个阈值 T 的边(T 由 E 确定,E 是用户定义的),只存储最小的 E 边向量中的权重低于 T 以供以后使用。你能给我一些建议如何以有效的方式实现这一目标吗?最好避免对整个邻接矩阵进行任何形式的存储,只需使用流式结构即可。所以我想知道我应该如何生成矩阵并进行阈值处理?

我猜需要读写文件,对吧?

一种方法是,在对文件进行某种操作后,我设置阈值 E 并执行以下操作:

我从矩阵中一个一个地读取元素,所以我不会读取整个矩阵(你能展示几行 C++ 代码来实现这一点吗?),然后将它的权重插入到一个最小堆中,存储它的向量中对应的边缘索引。当堆的大小达到 E 时我停止,这样边缘索引的向量就是我想要的。

您认为这是正确的做法吗?还有其他建议吗?请指出我在这里可能遇到的任何错误。非常感谢!

【问题讨论】:

  • 听起来sparse-matrix 会减轻您的内存问题,尽管最坏的情况仍然会消耗大量内存。如何实现稀疏性是一个单独的问题。
  • 这里的随机性有多随机?您可以使用只需要存储种子值的 PRNG。可能有 N 个种子值。
  • 这会产生断开的图是不是有问题?您需要保留原始图表,还是某种临时的?
  • @AdamBurry 是的,阈值化的结果是一个断开的森林。我不需要保留原始图表

标签: c++ memory matrix threshold


【解决方案1】:

如果不需要保留原始阈值图,那么听起来有一种简单的方法可以为自己节省大量工作。给定顶点数 (V=10,000),边数 (E) 是用户可配置的。只需随机选择顶点对,直到您拥有所需数量的边。我是否遗漏了一个明显的原因,为什么这不等同?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2015-10-14
    • 2019-03-13
    相关资源
    最近更新 更多