gpt4 book ai didi

c++ - 对于太大的矩阵, Armadillo eigs_sym() 的特征值分解失败

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:10 25 4
gpt4 key购买 nike

我最近安装了 Armadillo 并尝试了稀疏矩阵的特征值问题。不幸的是,分解失败是因为参数“N”(下面的代码)太大了。 1000. 我想知道这里发生了什么。矩阵不是很复杂——它有对角线结构。

更新

Mathematica 也有这个矩阵的问题。它告诉我 Arnoldi 算法不收敛。也许我需要在 arnoldi arpack 例程中手动指定一些参数以确保收敛?

这是我的代码:

#include <armadillo>

int main ()
{
double N = 1000.0;

// create matrix
int kmin = 0;
int kmax = static_cast<int>( std::floor( N/2.0 ) );
int dim = (kmax - kmin) + 1;

// locations and values in sparse matrices
arma::umat hc_locations (2, 3*dim-2);
arma::vec hc_values (3*dim-2);

// diagonal part
for (int k=0; k<dim; k++)
{
hc_locations (0,k) = k;
hc_locations (1,k) = k;
hc_values (k) = 2.0/N*static_cast<double>(kmin + k)*( 2.0*( N-2.0*static_cast<double>(k + kmin) ) - 1.0 );

}
// upper and lower diagonal
for (int k=0; k<dim-1; k++)
{
hc_locations (0,k+dim) = k;
hc_locations (1,k+dim) = k+1;
hc_values (k+dim) = 2.0/N*std::sqrt( ( static_cast<double>(k+1+kmin) ) *
( static_cast<double>(k+1+kmin) ) *
( N - static_cast<double>(2*(k+1+kmin)) + 1.0 ) *
( N - static_cast<double>(2*(k+1+kmin)) + 2.0 ) );

hc_locations (0, k+2*dim-1) = k+1;
hc_locations (1, k+2*dim-1) = k;
hc_values (k+2*dim-1) = 2.0/N*std::sqrt ( ( static_cast<double>(k+1+kmin) ) *
( static_cast<double>(k+1+kmin) ) *
( N - static_cast<double>(2*(k+kmin)) ) *
( N - static_cast<double>(2*(k+kmin)) - 1.0 ) );
}

arma::sp_mat Ham(hc_locations, hc_values);

// eigenvalue problem
arma::vec eigval;
arma::mat eigvec;

arma::eigs_sym( eigval, eigvec, Ham, 3, "sa");

最佳答案

对于大小为 2000 左右的小矩阵,通常更容易找到所有特征值和特征向量,因为这些方法不易受近奇异矩阵的影响。

我替换了你的代码

arma::eigs_sym( eigval, eigvec, Ham, 3, "sa"); 

arma::mat fullMat = arma::mat(Ham);
arma::eig_sym( eigval, eigvec, fullMat);

在我 2015 年后期的 Macbook Pro 上,编译后的程序只需不到一秒钟的时间即可求解。

关于c++ - 对于太大的矩阵, Armadillo eigs_sym() 的特征值分解失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36842712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com