【问题标题】:How can I increase the number of digits displayed when using Armadillo library使用犰狳库时如何增加显示的位数
【发布时间】:2014-11-08 16:31:21
【问题描述】:

我正在使用 Armadillo 线性代数库对矩阵进行对角化。我需要在最后增加显示/写入文件的位数。根据犰狳的reference,“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”的跟踪,但不适用于矩阵本身。知道我在这里做错了什么吗?

【问题讨论】:

  • 没什么。大概是lib本身setprecisions打印前的流。

标签: c++ armadillo iomanip


【解决方案1】:

我想我想出了如何做到这一点。可以使用“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

【讨论】:

    【解决方案2】:

    以下是在使用 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:");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多