2013-10-28 6 views
0

Я работаю над физическим исследованием в качестве бакалавра, и для этого мне нужно умножить большие матрицы порядка 348x348 с использованием C++. Мой учитель попросил меня проверить мой код, используя меньшие матрицы, такие как 6x6 и 12x12, и с этими матрицами я получил именно то, что искал. Но, когда я пытаюсь использовать один и тот же точный код для случая 348x348, я не получаю правильный вывод для умножения матриц. У меня есть чтение программы в некоторых данных и помещение данных в виде матрицы, и я проверил, чтобы все данные были прочитаны правильно. Но я все еще просто не получаю правильный продукт из матриц. Я использую C++-библиотеку Eigen, и я читаю числа для элементов матрицы как двойные. Мой учитель сделал расчет с ее собственной программой, и она получает правильный результат. Итак, мне просто интересно, может ли кто-нибудь указать мне в правильном направлении, чтобы выяснить, что не так?C++ Multiplying Large Matrices

myOutfile << NormCoord.transpose() * SqrtMass * NormCoord << endl; 

Это фактическое умножение. Я должен получить идентификационную матрицу, но с большей матрицей диагональные элементы отключены в 2 раза, а некоторые из недиагональных элементов немного слишком велики порядка 0,0001, когда я хочу, чтобы они были по крайней мере на порядок 10^(- 6)

+0

Мы, наверное, можно, но только если вы размещаете по крайней мере, некоторые из вашего кода. Не видя, что вы сделали, это все догадывается, что вы сделали неправильно. – nhgrif

+0

Проводка кода поможет, без кода невозможно узнать, в чем проблема. –

+0

Какую часть моего кода я должен публиковать? Это довольно простой код просто потому, что Eigen упрощает работу с матрицами и, как я уже сказал, при использовании меньших матриц я получал правильный вывод. – user2581502

ответ

0

Мое предположение: проблема в том, где вы Сохраните данные вашей матрицы в файл.

Престол, если вы сохраните double в файл, например так:

double d=...; 
out_file<<d; 

а затем прочитать его из файла, как это:

in_file>>d; 

вы не получите тот же номер. Двойник усекается при записи, и вы получаете только приблизительное число (со значительной ошибкой, которую я мог бы добавить)

Вы не сможете увидеть ошибку при печати матрицы, так как цифры усекаются точно там, где вы не печатайте их. Но когда вы умножаете данные как матрицу 348x348 - ошибка умножается на коэффициент 348 * 2 = 696, делая его достаточно большим, чтобы видеть.

То же самое с printf/scanf.

Решение? ., Когда вы пишете данные добавить точность:

out_file<<std::setprecision(20)<<d; // need to #include<iomanip> 

(я поставил 20 без уважительной причины, кроме «это много» Может быть, вам нужно больше или меньше - я не уверен, что точность двойников действительно)

Или еще лучше - сохранить двоичные данные, если сможете.

редактировать: в printf вы это делаете:

printf("%.20lf",d); 
+0

Вы забыли написать, что он также может кодировать двоичные данные в текст (например, 'base64') и писать это. – user1095108