使用MATLAB进行特征值分解

时间:2011-07-11 08:47:07

标签: matlab sparse-matrix eigenvalue

我正在进行方阵A的降维。我现在的问题是我有计算13000 x 13000矩阵A的eigvalue分解的问题,即[v d]=eigs(A)。因为它是一个稀疏矩阵,我使用4GB RAM得到“内存不足错误”。我确信这不是我的PC的问题,因为运行eigs命令时内存没有用完。我在网上看到的帮助与ARPACK有关。我检查了推荐的网站,但那里有很多文件,不知道下载哪个。另外,我不明白如何在MATLAB中使用它。另一个帮助说使用数值方法,但我不知道使用哪个特定方法。欢迎任何解决方案。

Error in ==> eigs>ishermitian at 1535
tf = isequal(A,A');

Error in ==> eigs>checkInputs at 479
            issymA = ishermitian(A);

Error in ==> eigs at 96
[A,Amatrix,isrealprob,issymA,n,B,classAB,k,eigs_sigma,whch, ...

Error in ==> labcomp at 20
[vector lambda] = eigs(A) 

我可以翻译这些错误以及如何纠正错误吗?

2 个答案:

答案 0 :(得分:3)

你没有看到内存耗尽的原因是它没有用完--Matlab无法分配所需的内存量。

尽管13000 x 13000双精度数组(Matlab中的默认数据类型)大约为1.25 GB,但这并不意味着4Gb的ram就足够了--Matlab需要1.25Gb的连续内存,否则它将无法成功分配您的矩阵。您可以在这里阅读有关Matlab内存问题的更多信息:http://www.mathworks.com/support/tech-notes/1100/1106.html

您可以尝试使用单一精度作为第一步:

[v d]=eigs(single(A));

你说

  

另一个帮助说使用数值方法

如果您是在计算机上进行的,那么它的定义就是数字。

如果你不想(或不能由于内存限制)在Matlab中做到这一点,你可以寻找线性代数库(ARPACK只是其中之一)并在Matlab之外完成计算。 / p>

答案 1 :(得分:0)

首先,如果A是稀疏的,单个(A)不会起作用。单稀疏矩阵未在MATLAB中实现,请参阅注释: parseUnsignedLong

db.tbl .GroupBy(a => a.ID) .Select(c => new { CompanyName = c.First().CustomerName, CustomerId = (int) c.Key, TotalQuotes = c.Count() }); 的调用可能会失败,因为您无法存储矩阵的两个副本(A和A')。通过评论该行并将ishermitian设置为issymAtrue来取消此问题,具体取决于您的矩阵是否为Hermitian。

如果您发现false内的内存存在更多问题,请尝试通过减少解决方案eigs或减少基础的最大大小来减少其内存素材(选项eigs(A,1)) ,默认情况下是问解决方案数量的两倍:

p