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
我正在尝试使用 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