【问题标题】:Submatrix with stride in Eigen Library特征库中跨步的子矩阵
【发布时间】:2015-11-03 04:58:52
【问题描述】:

我是 Eigen 的新手,我想创建 10 个 mxn 矩阵。 由于某些原因,我使用以下方法:

Matrix<double, m, n*10>

其中的内存分配好像会是这样的:

 _______________________________________________________________
|M1(1,1)|M2(1,1)|...|M10(1,1)|.....|M1(1,n)|M2(1,n)|...|M10(1,n)|
|  . .                                                          |
|  .                                                            |

现在如何为这 10 个矩阵中的每一个创建一个参考矩阵(通过参考而不复制数据)?

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

    我建议使用动态分配的矩阵,因为mn 可能很大。此外,您似乎假设矩阵内存是行主要的,而默认值是列主要的。在下面的示例中,我已明确将它们设为行专业。

    您可以像这样使用系列Eigen::Map&lt;MatrixXd&gt;s:

    #include <Eigen/Core>
    #include <iostream>
    
    using namespace Eigen;
    
    int main(void)
    {
        int m = 3;
        int n = 4;
        int x = 6;
        typedef Matrix < double, Dynamic, Dynamic, RowMajor > ourMat;
        ourMat  M1(m, n * x);
        M1.setConstant(9.9);
    
        for (int i = 0; i < x; i++)
        {
            Eigen::Map<ourMat, 0, Stride<Dynamic, Dynamic>> m_i(M1.data() + i,
                                                                m, n,
                                       Stride<Dynamic, Dynamic>(n*x,x));
            m_i.setConstant(double(i));
            std::cout << m_i << std::endl;
            std::cout << M1 << "\n" << std::endl;
    
        }
    
        Eigen::Map<VectorXd> m_i(M1.data(), m * n * x);
        std::cout << m_i.transpose() << std::endl;
    
        return 0;
    }
    

    【讨论】:

    • 谢谢,这是我正在寻找的答案
    猜你喜欢
    • 2022-11-08
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多