一个2x2自邻(厄密)矩阵的对角化
Diagonalization of a 2x2 self-adjoined (hermitian) matrix
对角化一个2x2厄米矩阵是简单的,它可以解析地完成。然而,当涉及到计算特征值和特征向量超过10^6次时,重要的是尽可能高效地完成它。特别是如果非对角线元素可以消失,则不可能使用一个公式来表示特征向量:必须使用if语句,这当然会减慢代码的速度。因此,我认为使用Eigen,其中声明2x2和3x3矩阵的对角化是优化的,仍然是一个不错的选择:
使用const std::complex<double> I ( 0.,1. );
inline double block_distr ( double W )
{
return (-W/2. + rand() * W/RAND_MAX);
}
test-loop应该是
...
SelfAdjointEigenSolver<Matrix<complex< double >, 2, 2> > ces;
Matrix<complex< double >, 2, 2> X;
for (int i = 0 ; i <iter_MAX; ++i) {
a00=block_distr(100.);
a11=block_distr(100.);
re_a01=block_distr(100.);
im_a01=block_distr(100.);
X(0,0)=a00;
X(1,0)=re_a01-I*im_a01;
//only the lower triangular part is referenced! X(0,1)=0.; <--- not necessary
X(1,1)=a11;
ces.compute(X,ComputeEigenvectors);
}
直接使用厄米矩阵的特征值和特征向量的公式和if语句来检查非对角线是否为零,编写没有特征的循环要快5倍。是我没有正确使用Eigen,还是这样的开销是正常的?还有其他的吗?哪一个对于小的自伴随矩阵是最优的?
默认情况下,使用迭代方法。要使用2x2和3x3的解析版本,您必须调用computeDirect函数:
ces.computeDirect(X);
但是它不可能比解析公式的实现更快。
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何在自删除后将对象设置为nullptr
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 如何打开并写入一个名称取自C++中字符串的文件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- 一个2x2自邻(厄密)矩阵的对角化