Eigen C ++中的矩阵矩阵

问题描述 投票:1回答:3

我正在用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
3个回答
2
投票

我不相信Eigen会为您提供完成这项工作的方法。我想一想连接到Matrix或Sparse矩阵的其他函数,例如:

  • inverse()
  • norm()
  • m.row()* m.col()

当矩阵元素号替换为矩阵时,本征该怎么办?

我能理解的是,您希望有一种数据结构,以一种内存有效的方式存储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;

0
投票

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.