繁体   English   中英

Eigen C++ 中的矩阵矩阵

[英]Matrix of matrices in Eigen C++

我正在用 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 期望的是数字而不是结构,因此测试这个简单示例失败。

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

有什么办法可以使这项工作?

任何帮助表示赞赏。

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

  • 逆()
  • 规范()
  • 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;

内存效率较低,但使用 vector 容器可能更容易访问:

#include <vector>

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

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

#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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM