【问题标题】:Adjacency uint8 sparse eigenvalues邻接 uint8 稀疏特征值
【发布时间】:2016-01-12 18:26:00
【问题描述】:

我有一个源矩阵和目标矩阵,我正在使用稀疏函数创建一个邻接矩阵。

W = sparse(w1(:,1),w1(:,2),1,n,n);

我的 n 大约等于 540,000(这是我拥有的数据的一个子集)。创建矩阵本身在计算上非常容易。但是,我需要获得所述矩阵的特征值。更准确地说

rho = max(abs(eigs(W)));

一行代码需要很长时间。稍微研究一下,我被引导相信获得稀疏矩阵的特征值在计算上是昂贵的。我不能使用完整的命令,比如 uint8(full(W)),因为我最终超出了最大矩阵大小/内存容量(130GB 内存)。但是,如果格式为 uint8,我将能够创建所述完整的邻接矩阵。

感谢任何帮助。我认为我需要的是以下之一

  • 将邻接矩阵直接构造为完整 uint8 的另一种方法;
  • 一种将我创建的邻接矩阵转换为完整 uint8 的方法;或
  • 计算这些特征值的另一种方法

【问题讨论】:

  • 在写我的答案时,我假设 w1 是未排序的并且很大以便快速排序。如果这不是真的,可以逐列构建矩阵,这比我写的答案需要更少的内存。
  • 大小为 n*n 的 uint8 矩阵不适合您的记忆。它需要540000.^2/1024^3 GB 内存,即 271GB。对于这么大的矩阵,使用sparse 可能是最好的选择。
  • 如果我错了请纠正我,但我刚刚意识到eig 和eigs 函数只能在双类型矩阵中运行。看来我没有其他方法可以在 matlab 上计算这些特征值。
  • 文档中没有说明,但是 double 可能是两个函数都支持的唯一类。 eig 也可用于sym

标签: matlab sparse-matrix adjacency-matrix eigenvalue


【解决方案1】:

使用W = sparse(w1(:,1),w1(:,2),1,n,n);,您将创建一个仅包含 0 或 1 的矩阵。虽然数据类型 uint8 是不可能的,但您可以选择创建一个 sparse logical 矩阵。这样可以避免使用 64 位数据类型

W = sparse(w1(:,1),w1(:,2),true,n,n);
W = uint8(full(W));

【讨论】:

    【解决方案2】:

    知道您使用整数的计划不是解决方案,我再次阅读了您的问题,并意识到您在不正确使用eigs 时浪费了很多性能。如果您只对最大特征值感兴趣,请只计算这个特征值。

    rho = abs(eigs(W,1));
    

    【讨论】:

    • 这种方法肯定更好。我已经对W 的子矩阵进行了测试,但是,如果我超过 10,000 个,事情就会再次变得混乱。因为rho=max(abs(eigs(W))) 是W 的光谱半径,所以我计划使用格尔凡德公式的近似值,比如normest(W^50)^(1/50)。
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 2013-09-25
    • 2017-08-14
    • 2015-07-23
    • 2015-08-27
    • 2012-08-20
    • 2022-11-23
    • 2019-12-30
    相关资源
    最近更新 更多