Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分裂复数环上矩阵的LDL分解_C++_Matrix_Linear Algebra_Eigen_Eigen3 - Fatal编程技术网

C++ 分裂复数环上矩阵的LDL分解

C++ 分裂复数环上矩阵的LDL分解,c++,matrix,linear-algebra,eigen,eigen3,C++,Matrix,Linear Algebra,Eigen,Eigen3,我用特征库来分解低密度脂蛋白。然而,我不是在复数环(或实数环)上工作,而是在复数环上工作 我已经在下面使用Cholesky-Crout算法编写了我自己的LDL分解版本,并对其进行了测试,以证明其有效性: 模板 元组ldlt(矩阵m) { 矩阵L=矩阵::恒等式(); 矩阵D; for(int i=0;i

我用特征库来分解低密度脂蛋白。然而,我不是在复数环(或实数环)上工作,而是在复数环上工作

我已经在下面使用Cholesky-Crout算法编写了我自己的LDL分解版本,并对其进行了测试,以证明其有效性:

模板
元组ldlt(矩阵m)
{
矩阵L=矩阵::恒等式();
矩阵D;
for(int i=0;ij){
T_和=0;
对于(int k=0;k
此外,我的版本也适用于复数


我尝试过使用Eigen版本的LDLT,但是当我在因子分解(包括置换矩阵)中乘以矩阵时,我没有得到我开始使用的矩阵。我的代码如下:

//------------------------------------------------------------------------------
#包括
#包括
#包括
#包括
//------------------------------------------------------------------------------
使用名称空间std;
使用名称空间特征;
//------------------------------------------------------------------------------
#定义SPLITCPXCHAR'j'
//------------------------------------------------------------------------------
类分裂复合体
{
双re;
双im;
公众:
SplitComplex();
SplitComplex(const SplitComplex&);//复制构造函数
SplitComplex(双,双);
复合物(双);
双实(空)常数;
双图像(无效)常数;
双abs(void)常数;
};
//------------------------------------------------------------------------------
//算术运算符
SplitComplex运算符+(SplitComplex,SplitComplex);
SplitComplex运算符-(SplitComplex,SplitComplex);
SplitComplex运算符*(SplitComplex,SplitComplex);
SplitComplex运算符/(SplitComplex,SplitComplex);
//------------------------------------------------------------------------------
SplitComplex::SplitComplex()
{
re=0.0;
im=0.0;
}
//------------------------------------------------------------------------------
SplitComplex::SplitComplex(常量SplitComplex和aComplex)
{
re=aComplex.real();
im=aComplex.imag();
}
//------------------------------------------------------------------------------
SplitComplex::SplitComplex(双d)
{
re=d;
im=0.0;
}
//------------------------------------------------------------------------------
SplitComplex::SplitComplex(双区域、双目标)
{
re=面积;
im=省;
}
//------------------------------------------------------------------------------
双拆分复数::实(空)常量
{
返回re;
}
//------------------------------------------------------------------------------
双拆分复合::imag(void)const
{
返回即时消息;
}
//------------------------------------------------------------------------------
双分裂复合体::abs(void)const
{
返回sqrt(标准::abs(re*re-im*im));
}
//------------------------------------------------------------------------------

ostream&operator“我没有得到我开始使用的矩阵”-这是意料之中的,因为浮点数学往往会累积错误。你能说得更具体些吗?错误是什么?@Yakk AdamNevraumont当我从
h
中减去乘积
P.inverse()*L*D*L.adjoint()*P
时,我并没有得到一个条目都很小的矩阵。它们不必精确为零,但应该非常小。然而,在我的实现中,我确实得到了一个近似为零的矩阵。似乎在右边涉及换位的产品中存在一个问题。如果你计算
PtL=P.transpose()*LPtL*D*PtL.adjoint()
您的机器精度在原始矩阵的范围内。另外,
bla.restructuredMatrix()
是您所期望的(您需要为此提供一个
操作符!=
。@chtz谢谢,这很有效@chtz如果你写一个答案,我会接受“我没有得到我开始使用的矩阵”——这是意料之中的,因为浮点数学往往会累积错误。你能说得更具体些吗?错误是什么?@Yakk AdamNevraumont当我从
h
中减去乘积
P.inverse()*L*D*L.adjoint()*P
时,我并没有得到一个条目都很小的矩阵。它们不必精确为零,但应该非常小。然而,在我的实现中,我确实得到了一个近似为零的矩阵。似乎在右边涉及换位的产品中存在一个问题。如果你计算
PtL=P.transpose()*LPtL*D*PtL.adjoint()
您的机器精度在原始矩阵的范围内。另外,
bla.restructuredMatrix()
是您所期望的(您需要为此提供一个
操作符!=
。@chtz谢谢,这很有效@如果你写一个答案,我会接受的