I would like to do the following matrix product using Eigen:
Eigen::VectorXd vector = Eigen::VectorXd::Random(1000000); // a given long vector
Eigen::MatrixXd product = vector * vector.transpose();
I'm not sure Eigen will create a copy of vector when calling vector.transpose()
or just a view. I experimented by creating a vector and its transpose then modify the value of original vector:
Eigen::VectorXd vector(3);
vector << 1, 2, 3;
Eigen::VectorXd vectorTranspose = vector.transpose();
vector(0) = 10;
std::cout << vector << "\n"; // shows col vector [10, 2, 3]
std::cout << vectorTranspose << "\n"; // still shows col vector [1, 2, 3]
std::cout << vector * vectorTranspose << "\n"; // this gives the error of "invalid matrix product"
std::cout << vector * vector.transpose() << "\n"; // this gives the correct behavior
so my questions are:
- For a column vector with shape n by 1, why does transpose still give a column vector instead of row vector?
- Is calling vector * vector.transpose() causing a waste due to the creation of vector.transpose() or does Eigen do something clever about it?