C++ C++;特征:如何动态连接矩阵(指针问题?)

C++ C++;特征:如何动态连接矩阵(指针问题?),c++,matrix,eigen,C++,Matrix,Eigen,我有以下问题: 我有几个部分(本征)矩阵,我想连接到另一个更大的矩阵变量,我只有一个指针。但是,较小矩阵的大小及其数量都是动态的,因此我不能使用rows(),col*sd[0]->cols(); 对于(inti=0;iblock(0,i*sd[0]->cols(),sd[0]->rows(),sd[0]->cols())=*(sd[i]); } 不幸的是,这似乎以某种方式覆盖了*ret变量的某些部分-因为在通过块进行赋值之前,大小(在我的测试用例中)正确地显示为2x1。赋值之后,它变为1407

我有以下问题: 我有几个部分(本征)矩阵,我想连接到另一个更大的矩阵变量,我只有一个指针。但是,较小矩阵的大小及其数量都是动态的,因此我不能使用rows(),col*sd[0]->cols(); 对于(inti=0;iblock(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;
}
#包括
#包括
int main()
{
本征::矩阵XXD*A=新的本征::矩阵XXD(2,2);
本征::矩阵XXD*B=新的本征::矩阵XXD(3,3);
*A行(),A->cols()+B->cols());
结果->零(A->rows()+B->rows(),A->cols()+B->cols());
结果->块(0,0,A->rows(),A->cols())=*A;
结果->块(A->rows(),A->cols(),B->rows(),B->cols())=*B;

std::我不能谢谢你。你文章的第一个版本不起作用-不能直接初始化指向零的矩阵指针。但是,这一个有效。我将更新我的文章,使其更精确。因此-我再次查看了不同片段之间的差异,似乎我最初的问题是我没有将矩阵初始化为指定c值…所以用“new”分配内存显然是不够的。你同意这个评估吗?再次感谢!@cleros是的,这是正确的,使用
new
不会初始化矩阵中的任何内容。事实上,甚至
MatrixXd mat(2,2);
不会将元素初始化为零。您需要显式初始化矩阵。@cleros为什么要使用指针而不是简单的
矩阵xD
(或对它的引用)
MatrixXd
本身执行内存分配等操作,因此使用指针没有明显的优势。此外,不太可能将虚拟函数用于
Eigen
…也可以使用引用/const引用作为输入,然后按值返回,编译器将根据返回值优化进行优化
#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;
}