持有多个特征矩阵Xd的最有效方式

Most efficient way to hold several Eigen MatrixXd

本文关键字:Xd 有效 方式 特征      更新时间:2023-10-16

我需要将数据存储在类似 3D 的结构中,但是我一直依靠 Eigen 库来处理代码中的矩阵结构,而 Eigen 不提供 3D 矩阵。我找到了两种可能的解决方法:

 int x,y,z;
 Eigen::Matrix<Eigen::Matrix<double,Dynamic,Dynamic>, Dynamic,1> M(z);
 for (int i = 0; i < M.rows(); ++i) M(i)=MatrixXd::Zero(x,y);
 // access coefficients with M(z)(x,y)

 int x,y,z;
 std::vector<Eigen::Matrix<double,Dynamic,Dynamic> > M(z);
 for (int i = 0; i < M.rows(); ++i) M[i]=MatrixXd::Zero(x,y);
 // access coefficients with M[z](x,y)

我的问题是:使用这两种方法是否有任何速度/效率优势,或者它们是等效的?

试试这段代码:

#include<windows.h>
LARGE_INTEGER startTime, stopTime;
LARGE_INTEGER freq;
int main(int argc, char *argv[])
{
    QueryPerformanceFrequency(&freq);
    // ACCESS TIME 1
    QueryPerformanceCounter(&startTime);
    int x1,y1,z1;
    Eigen::Matrix<Eigen::Matrix<double,Dynamic,Dynamic>, Dynamic,1> M1(z1);
    for (int i = 0; i < M1.rows(); ++i) M1(i)=MatrixXd::Zero(x1,y1);
    QueryPerformanceCounter(&stopTime);
    double msecs1= (double)(stopTime.QuadPart - startTime.QuadPart) / (double)freq.QuadPart;
    // ACCESS TIME 2
    QueryPerformanceCounter(&startTime);
    int x2,y2,z2;
    std::vector<Eigen::Matrix<double,Dynamic,Dynamic> > M2(z2);
    for (int i = 0; i < M2.rows(); ++i) M2[i]=MatrixXd::Zero(x2,y2);
    QueryPerformanceCounter(&stopTime); 
    double msecs2= (double)(stopTime.QuadPart - startTime.QuadPart) / (double)freq.QuadPart;
    // RESULT
    cout<<"t1="<<msecs1<<", t2="<<msecs2;   
}