[英]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 会给你一个方法来完成这项工作。 我会考虑连接到矩阵或稀疏矩阵的其他函数,例如:
当矩阵元素编号被矩阵替换时,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.