C++ - 将 0 到 9 之间的整数设置为特征库矩阵的随机值

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

本文关键字:为特征 随机 设置 整数 C++ 之间      更新时间:2023-10-16

我正在尝试使用 C++ 中的 Eigen 库制作一个简单的随机矩阵乘法程序,但我使用 setRandom(); 函数得到的数字是从 -1 到 1 的浮点数,我希望数字是从 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

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

#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

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

,如下所示
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做同样的事情,仅此而已,我希望这可以帮助将来的其他人。