C++ Eigen:如何动态连接矩阵(指针问题?)
C++ Eigen: How to concatenate matrices dynamically (pointer issue?)
我遇到以下问题:
我有几个部分(本征)MatrixXds 我想连接到另一个更大的 MatrixXd 变量,我只有一个指针。但是,较小矩阵的大小和数量都是动态的,所以我不能轻易使用 << 运算符。
所以我正在尝试以下操作(较小的矩阵存储在 list_subdiagrams 中,显然,basis->cols() 定义了矩阵的数量),使用 Eigen 的 MatrixXd 块功能:
// sd[] contains the smaller matrices to be concatenated; all are of the same size
// col defines the total number of smaller matrices
MatrixXd* ret = new MatrixXd(sd[0]->rows(), col*sd[0]->cols());
for (int i=0; i<col; ++i){
ret->block(0, i*sd[0]->cols(), sd[0]->rows(), sd[0]->cols()) = *(sd[i]);
}
不幸的是,这似乎以某种方式覆盖了 *ret 变量的某些部分 - 因为在通过块赋值之前,大小(在我的测试用例中)正确显示为 2x1。赋值后变为 140736006011136x140736006011376 ...
感谢您的帮助!
不知道尺码是什么意思?您可以使用成员函数 cols()/rows()
来获取大小。另外,我假设通过连接你的意思是直接和?在这种情况下,您可以执行类似
#include <iostream>
#include <Eigen/Dense>
int main()
{
Eigen::MatrixXd *A = new Eigen::MatrixXd(2, 2);
Eigen::MatrixXd *B = new Eigen::MatrixXd(3, 3);
*A << 1, 2, 3, 4;
*B << 5, 6, 7, 8, 9, 10, 11, 12, 13;
Eigen::MatrixXd *result = new Eigen::MatrixXd(A->rows() + B->rows(), A->cols() + B->cols());
result->Zero(A->rows() + B->rows(), A->cols() + B->cols());
result->block(0, 0, A->rows(), A->cols()) = *A;
result->block(A->rows(), A->cols(), B->rows(), B->cols()) = *B;
std::cout << *result << std::endl;
delete A;
delete B;
delete result;
}
所以首先确保它适用于 2 个矩阵,测试它,然后将它扩展到 N
。
我遇到以下问题: 我有几个部分(本征)MatrixXds 我想连接到另一个更大的 MatrixXd 变量,我只有一个指针。但是,较小矩阵的大小和数量都是动态的,所以我不能轻易使用 << 运算符。
所以我正在尝试以下操作(较小的矩阵存储在 list_subdiagrams 中,显然,basis->cols() 定义了矩阵的数量),使用 Eigen 的 MatrixXd 块功能:
// sd[] contains the smaller matrices to be concatenated; all are of the same size
// col defines the total number of smaller matrices
MatrixXd* ret = new MatrixXd(sd[0]->rows(), col*sd[0]->cols());
for (int i=0; i<col; ++i){
ret->block(0, i*sd[0]->cols(), sd[0]->rows(), sd[0]->cols()) = *(sd[i]);
}
不幸的是,这似乎以某种方式覆盖了 *ret 变量的某些部分 - 因为在通过块赋值之前,大小(在我的测试用例中)正确显示为 2x1。赋值后变为 140736006011136x140736006011376 ...
感谢您的帮助!
不知道尺码是什么意思?您可以使用成员函数 cols()/rows()
来获取大小。另外,我假设通过连接你的意思是直接和?在这种情况下,您可以执行类似
#include <iostream>
#include <Eigen/Dense>
int main()
{
Eigen::MatrixXd *A = new Eigen::MatrixXd(2, 2);
Eigen::MatrixXd *B = new Eigen::MatrixXd(3, 3);
*A << 1, 2, 3, 4;
*B << 5, 6, 7, 8, 9, 10, 11, 12, 13;
Eigen::MatrixXd *result = new Eigen::MatrixXd(A->rows() + B->rows(), A->cols() + B->cols());
result->Zero(A->rows() + B->rows(), A->cols() + B->cols());
result->block(0, 0, A->rows(), A->cols()) = *A;
result->block(A->rows(), A->cols(), B->rows(), B->cols()) = *B;
std::cout << *result << std::endl;
delete A;
delete B;
delete result;
}
所以首先确保它适用于 2 个矩阵,测试它,然后将它扩展到 N
。