【问题标题】:Matrix of matrices in Eigen C++Eigen C++中的矩阵矩阵
【发布时间】:2015-03-21 17:16:41
【问题描述】:

我正在用 C++ 创建一个电路分析库(也是为了学习 C++,所以我对它很陌生)。

在熟悉 Eigen 之后,我想要一个矩阵,其中每个单元都承载一个 3x3 复矩阵。

到目前为止,我已经尝试过这个非常简单的原理证明:

typedef Eigen::MatrixXcd cx_mat;
typedef Eigen::SparseMatrix<cx_mat> sp_mat_mat;

void test(cx_mat Z1){
   sp_mat_mat Y(2, 2);

    Y(0, 0) = Z1;
    Y(2, 2) = Z1;

    cout << "\n\nY:\n" << Y << endl;
}

测试这个简单的例子失败,可能是因为 Eigen 期望的是数字而不是结构。

事实上,矩阵的矩阵是稀疏的,因此是稀疏矩阵结构。

有什么办法可以做到吗?

感谢任何帮助。

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

    我不相信 Eigen 会给你一种方法来完成这项工作。我考虑一下连接到 Matrix 或 Sparse 矩阵的其他函数,例如:

    • 逆()
    • 规范()
    • m.row()*m.col()

    当矩阵元素个数被矩阵替换时,Eigen应该怎么做?

    我能理解的是,您希望拥有一个数据结构,以一种内存高效的方式存储您的 Eigen::MatrixXcd

    您也可以使用地图容器来实现这一点:

    #include <map>
    
    typedef Eigen::MatrixXcd cx_mat;
    cx_mat Z1;
    
    std::map<int,Eigen::MatrixXcd> sp_mat_mat;
    int cols = 2;
    sp_mat_mat[0*cols+0]=Z1;
    sp_mat_mat[2*cols+2]=Z1;
    

    使用矢量容器可能会降低内存效率,但可能更容易访问:

    #include <vector>
    
    std::vector<std::vector<Eigen::MatrixXcd>> mat_mat;
    

    【讨论】:

      【解决方案2】:

      您找到创建矩阵矩阵的方法了吗? 我看到我们可以使用二维数组来创建矩阵矩阵。 例如,

      #include <Eigen/Dense>
      MatrixXd A; 
      MatrixXd B;
      A = MatrixXd::Random(3, 3);
      B = MatrixXd::Random(3, 4);
      C = MatrixXd::Random(4, 4);
      
      MatrixXd D[2][2];
      D[0][0] = A;
      D[0][1] = B; D[1][0] = B.transpose();
      D[1][1] = C;
      

      我不知道这种方式是否节省内存。我们来看看吧。

      【讨论】:

      • 嗨!,我的问题一开始就被误导了。最好堆叠矩阵。
      【解决方案3】:

      您问“稀疏矩阵结构。有什么办法可以使它工作吗?”我会说不,因为首先将电路设计转换为“矩阵矩阵”并不容易。如果你想模拟一些东西,你选择一个接近它的表示。在电子电路图的情况下,内存中的模式应该是有向图,带有链表项。在每个节点/结点,有一个矩阵表示特定组件输入到输出传输(例如电阻器、电容器、晶体管)的行为,您可以通过分配给每个组件的矩阵传播信号。转换后的信号最终通过连接图中的连接到达输出。在软件中,它应该类似地工作.. 建议进一步阅读:https://core.ac.uk/download/pdf/53745212.pdf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多