c++ - Hermitian 矩阵和 C++ 中的带符号零
问题描述
我只是想检查一个矩阵是否是厄米特矩阵。令 A[ ][ ] 是一个二维数组。C[ ][ ] 是 A[ ][ ] 的共轭矩阵。T[ ][ ] 是 C[ ][ ] 的转置矩阵。现在我要检查 T[ ][ ]==A[ ][ ]。我编译了程序,输入一个有效的厄米矩阵后,它说这个矩阵不是厄米矩阵。我找到了背后的原因。编译器将 0==-0 评估为 false。但是在我朋友的pc编译器中说矩阵是Hermitian。我们都运行相同的代码。这背后的原因是什么?我给你举个例子。我有一个元素 A[0][0]=5。经过共轭和转置后,这个元素变成了 5-0i(复数部分为负零)。所以我的计算机无法评估 5 和 5-0i 的相等性。如何克服这个问题?
#include<iostream>
#include<complex>
using namespace std;
int main() {
typedef complex<double> comp;
comp A[3][3]={{2,comp(2,1),4},{comp(2,-1),3,comp(0,1)},{4,comp(0,-1),1}};
comp C[3][3]; comp T[3][3];
int a=0;
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
C[i][j]=conj(A[i][j]); }}
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
T[i][j]=C[j][i]; }}
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
if(T[i][j]==A[i][j])
a=a+1;
else a=0; }}
if(a==9)
cout << "Hermitian" << endl;
else cout << "Not Hermitian" << endl;
return 0;
}
解决方案
你可以替换
typedef complex<double> comp;
和
typedef complex<int> comp;
或者,如果您想继续使用 double(从您的示例中我看不出任何原因),您可以使用此函数来比较两个复数:
bool double_equals(complex<double> a, complex<double> b, double epsilon = 0.001)
{
bool retval = false;
if ((std::abs(a.real() - b.real()) < epsilon) && (std::abs(a.imag() - b.imag()) < epsilon))
retval = true;
return retval;
}
另请参阅: 两个双精度值的 c++ 比较无法正常工作
推荐阅读
- arduino - 用于 NUCLEO-F446RE 的 STM32duino 时钟配置
- android - 滚动时GraphView的水平标签问题
- scala - 如何在合并中替换空值并添加
- javascript - jquery 检查父元素中是否有特定的文本,如果有,则在特定的预先存在的子元素之后添加子元素
- vb.net - VB.NET 在图片框中绘制与设备无关的位图
- python - 如何处理依赖的多个主要版本
- javascript - 交换两个 ngx-select 的值
- c - S32K146EVB 擦除/写入闪存时发生读取冲突
- json - 如何在pyspark中将rdd转换为嵌套的json
- php - 大型 php 站点地图(使用数据库连接)可以减慢/阻塞服务器吗?