4

我正在使用犰狳线性代数库对矩阵进行对角化。我需要在最后增加显示/写入文件的位数。根据犰狳的参考,“arma::mat”将创建一个双矩阵。因此,我尝试使用“iomanip”中的 std::setprecision,但效果不佳。这是捕获问题的最小代码:

#include<iostream>
#include<armadillo>
#include<iomanip>

int main()
{
   double Trace_A = 0.;
   arma::mat A;
   A = :arma::randu<arma::mat>(5,5);
   Trace = arma::trace(A);         

   // Normal output
   std::cout << "A = \n" <<A ;
   std::cout << "Trace(A) = " << Trace_A << std::endl;
   std::cout << "---------------------------------------------" << std::endl;

   // Displaying more digits
   std::cout << std::fixed << std::setprecision(15);
   std::cout << "A = \n" << A;
   std::cout << "Trace(A) = " << Trace_A << std::endl;
}

而且,这是我得到的:

A = 
   0.8402   0.1976   0.4774   0.9162   0.0163
   0.3944   0.3352   0.6289   0.6357   0.2429
   0.7831   0.7682   0.3648   0.7173   0.1372
   0.7984   0.2778   0.5134   0.1416   0.8042
   0.9116   0.5540   0.9522   0.6070   0.1567
Trace(A) = 1.83848
---------------------------------------------
A = 
   0.8402   0.1976   0.4774   0.9162   0.0163
   0.3944   0.3352   0.6289   0.6357   0.2429
   0.7831   0.7682   0.3648   0.7173   0.1372
   0.7984   0.2778   0.5134   0.1416   0.8042
   0.9116   0.5540   0.9522   0.6070   0.1567
Trace(A) = 1.838476590271330 

奇怪的是,它适用于传递给双变量“Trace_A”的跟踪,但不适用于矩阵本身。知道我在这里做错了什么吗?

4

2 回答 2

6

我想我知道如何做到这一点。可以使用“raw_print”来完成:

A.raw_print(std::cout);

这给出了:

0.8402   0.1976   0.4774   0.9162   0.0163
0.3944   0.3352   0.6289   0.6357   0.2429
0.7831   0.7682   0.3648   0.7173   0.1372
0.7984   0.2778   0.5134   0.1416   0.8042
0.9116   0.5540   0.9522   0.6070   0.1567

0.84018771715 0.19755136929 0.47739705186 0.91619506800 0.01630057162
0.39438292682 0.33522275571 0.62887092476 0.63571172796 0.24288677063
0.78309922376 0.76822959481 0.36478447279 0.71729692943 0.13723157679
0.79844003348 0.27777471080 0.51340091020 0.14160255536 0.80417675423
0.91164735794 0.55396995580 0.95222972517 0.60696887626 0.15667908925
于 2014-11-08T20:16:59.027 回答
1

以下是使用 raw_print 之前设置精度的方法之一

arma::mat A = arma::randu<arma::mat>(5,5);

cout.precision(11);
cout.setf(ios::fixed);

A.raw_print(cout, "A:");

设置精度的正常也可以

arma::mat A = arma::randu<arma::mat>(5,5);

cout << fixed << setprecision(11);

A.raw_print(cout, "A:");
于 2020-06-27T18:56:08.307 回答