C++ - 将 0 到 9 的整数设置为 Eigen 库矩阵的随机值

C++ - Setting ints from 0 to 9 as random values for Eigen library matrix

我正在尝试使用 C++ 中的 Eigen 库制作一个简单的随机矩阵乘法程序,但是我使用的数字setRandom(); 函数是 floats 从 -1 到 1,我希望数字是 ints 从 0 到 9,如何我会这样做吗?

我的代码:

int mat_size;
cout << "Enter the size of the array: " << endl;
cin >> mat_size;

MatrixXd m = MatrixXd(mat_size,mat_size);
MatrixXd n = MatrixXd(mat_size,mat_size);
m.setRandom();
n.setRandom();

cout << "Matrix m: " << endl << m << endl;
cout << "Matrix n: " << endl << n << endl;
cout << "The product between m and n is: " << endl;
cout << m * n << endl;

并且 3*3 矩阵的输出总是:

Matrix m: 
 0.680375   0.59688 -0.329554
-0.211234  0.823295  0.536459
 0.566198 -0.604897 -0.444451
Matrix n: 
   0.10794  -0.270431    0.83239
-0.0452059  0.0268018   0.271423
  0.257742   0.904459   0.434594
The product between m and n is: 
-0.0384828  -0.466066   0.585123
 0.0782496   0.564396   0.280774
-0.0260932  -0.571318   0.113959

我希望它们是这样的:

matrix: 
4 8 9
3 2 7
3 8 1

您可以尝试将浮点数转换为整数,例如

float f = m;
float f2 = n;
int i = int(f + 0.5);
int j = int (f2 + 0.5);

它会四舍五入,因此它可能不是本征值的 100% 准确表示。

答案如下:

对于矩阵 m:

for(int i = 0; i < mat_size; i++) {
    for(int j = 0; j < mat_size; j++) {
        m(i,j) = static_cast<int>(10.0*abs(m(i,j)));
    }
}

使用 5 作为 mat_size 这个输出:

Matrix m: 
6 6 0 8 9
2 3 2 2 5
5 5 2 4 7
5 4 0 7 6
8 1 9 2 6

所以我只是对 n 做同样的事情,仅此而已,我希望这可以在将来帮助其他人。

这是一种无需显式循环遍历每个矩阵元素即可工作的可能性:

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;

int main(){
  int nrow = 8;
  int ncol = 8;
  MatrixXd m = (MatrixXd::Random(nrow,ncol)+MatrixXd::Ones(nrow,ncol))*5;  
  MatrixXi mi = m.cast<int>();    
  cout << mi << endl;  
}

输出:

8 2 6 1 6 5 0 0
3 5 7 4 2 7 9 0
7 4 1 1 6 4 5 4
7 6 6 1 5 8 0 0
9 3 0 9 4 2 1 2
1 5 2 2 9 3 6 9
3 9 1 5 2 8 8 9
7 9 8 8 7 9 3 8