Эрмитова матрица и нулевой знак в с ++ - PullRequest
0 голосов
/ 10 мая 2018

Я просто хочу проверить, является ли матрица эрмитовой или нет.Пусть A [] [] является 2D-массивом.C [] [] - сопряженная матрица A [] [].T [] [] - транспонированная матрица C [] [].Теперь я должен проверить, если T [] [] == A [] [].Я скомпилировал программу и после ввода действительной эрмитовой матрицы было сказано, что матрица не эрмитова.Я нашел причину этого.Компилятор оценил 0 == - 0 в ложь.Но у моих друзей компилятор сказал, что матрица эрмитова.Мы оба запустили один и тот же код.В чем причина этого?Я собираюсь привести вам пример.У меня есть элемент 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;
} 

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете просто заменить

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 ++ Сравнение двух двойных значений не работает должным образом

...