我正在用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会为您提供完成这项工作的方法。我想一想连接到Matrix或Sparse矩阵的其他函数,例如:
当矩阵元素号替换为矩阵时,本征该怎么办?
我能理解的是,您希望有一种数据结构,以一种内存有效的方式存储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;
您是否找到一种创建矩阵矩阵的方法?我看到我们可以使用二维数组来创建矩阵矩阵。例如,
#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