MATLAB eigs 返回非常奇怪的结果

标签 matlab eigenvector

我有一个稀疏的实数对称矩阵,我正在尝试将其分解为其 e.v. 奇怪的是:如果我使用 eigs 计算前 20 个特征向量,我得到的结果与我计算前 50 个然后选出前 20 个的结果不同。

opts.v0 = rand(size(K,1),1);
opts.p = 100;

n_ev = 20;
[V,D] = eigs(K, n_ev,'lm',opts);
Display(V,79,95,size(V,1)/(79*95),20)

n_ev = 50;
[V,D] = eigs(K, n_ev,'lm',opts);
Display(V,79,95,size(V,1)/(79*95),20)

n_ev = 70;   
[V,D] = eigs(K, n_ev,'lm',opts);
Display(V,79,95,size(V,1)/(79*95),20)
  • Display 是我编写的一个函数,它 reshape 这些 E.V 并显示前 20 个(第 5 个参数)。

这可以用特征向量不唯一这一事实来解释吗? 任何其他见解将不胜感激。

谢谢

最佳答案

根据约翰in a mathworks post

This is because eigs uses a random start

因为 eigs 是一个 ARPACK库,通读其文档可能会很耗时。但是,我们可以假设 1) 它不尝试求解逆矩阵,并且 2) 涉及随机数,因此输出具有随机误差。

做了一个实验:

clear;clc;close all

K = randn(100);

N = 20;
DD = zeros(N,10);
for ii = 1:10
    [V,D] = eigs(K, N,'lm');
    DS = diag(D);
    [~,DI] = sort(abs(DS),'descend');
    DS = DS(DI);
    DD(:,ii) = DS;
end
DN1 = abs(DD);

N = 50;
DD = zeros(N,10);
for ii = 1:10
    [V,D] = eigs(K, N,'lm');
    DS = diag(D);
    [~,DI] = sort(abs(DS),'descend');
    DS = DS(DI);
    DD(:,ii) = DS;
end
DN2 = abs(DD);
DN2 = DN2(1:20,:);

N = 20;
DD = zeros(N,10);
for ii = 1:10
    [V,D] = eigs(K, N,'lm');
    DS = diag(D);
    [~,DI] = sort(abs(DS),'descend');
    DS = DS(DI);
    DD(:,ii) = DS;
end
DN3 = abs(DD);

这遵循您的程序:首先是前 20 名,然后是前 50 名,然后是前 20 名。在每个步骤中,相同的过程重复 10 次。

我已经保存了每个步骤的前 20 个并做了快速比较:

Err = (sum((DN1-DN2).^2+(DN2-DN3).^2+(DN1-DN3).^2,1)).^.5;
>> Err

Err =

  Columns 1 through 6

    0.0000    0.0000    0.0000    0.0870    0.0000    0.0000

  Columns 7 through 10

    0.0000    0.0000    0.0870    0.0870

>> min(Err),max(Err)

ans =

   3.1665e-13


ans =

    0.0870

>> 

在大多数情况下,错误与 eps(1) 相当,但少数错误很大。这表明,为了生成可靠的结果,可能需要重复计算和平均。


但是,如果您的问题仅仅是它们乱序(我想我现在明白您的意思了),您可以在求值后根据大小对向量进行排序。我的实验应该可以证明排序后前20总是相同的。


编辑:正如@TroyHaskin 在评论中指出的那样,您已经定义了opts(我公然删除了它)来定义随机种子。让我们添加这些行,看看错误会发生什么:

Err =

  Columns 1 through 6

    0.0016    0.0016    0.0016    0.0016    0.0016    0.0016

  Columns 7 through 10

    0.0016    0.0016    0.0016    0.0016

可能的(猜测的)解释:作为感兴趣的 e.v. 的数量。增加错误增长,因为“一些”公差被放宽以保证速度性能。

关于MATLAB eigs 返回非常奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42724627/

相关文章:

matlab - 在 MATLAB 中从矩阵中删除元素的最有效/最优雅的方法是什么?

matlab - 在 MATLAB 中计算函数的反函数

matlab - 音频.wav文件的SNR和评估过滤技术的客观措施

matlab - 卷积后 MatLab 中 -1 的移位

matrix - 酉矩阵的数值对角化

python - Python 中的特征值

python - 如何在Python中基于gram-matrix实现从距离矩阵中查找点的坐标?

普通 RV 上的 Matlab 'entropy()'

r - 查找给定特征值R的特征向量

c - 3 次迭代后重新启动 Lanczos 方法时出现段错误 coredump