如何使用向量中包含的 double[4][4] 数组?

Posted

技术标签:

【中文标题】如何使用向量中包含的 double[4][4] 数组?【英文标题】:How use arrays of double[4][4] contained in a vector? 【发布时间】:2014-02-13 16:38:44 【问题描述】:

我想在社区问我的问题。

我有一系列这种格式的 double[4][4] 数组:

double T1[4][4] = 
        -0.9827,   -0.1811,   -0.0388,    0.1234,
        0.0807,   -0.2303,   -0.9698,    0.1755,
        0.1666,   -0.9561,    0.2409,    0.6729,
            0,         0,         0,    1.00000    ;

double T2[4][4] = 
        -0.8524,   -0.5029,   -0.1432,    0.1963,
        0.1580,    0.0135,   -0.9874,    0.1285,
        0.4984,   -0.8643,    0.0680,    0.6237, 
            0,         0,         0,    1.00000 ;

T3、T4 等等……

我需要将所有这些数组插入一个容器中,以便从另一个需要该格式的数组的函数中获取一个,因为做这些阐述:

int verifica_punti(punto P, Mat& I, double TC[4][4], const double fc[2],const double KC[5], const double cc[2],const double alpha)

    //punto
    double P1[4] = P.x, P.y, P.z, 1.0;

    //iniz
    double Pc[3] = TC[0][3], TC[1][3], TC[2][3];

    //calc
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            Pc[i] += TC[i][j] * P1[j];
        
    
        //norm
        double PN[2] =  Pc[0]/Pc[2], Pc[1]/Pc[2] ;

现在,在这个网站和互联网上搜索我找到了一些例子来做到这一点,但在我的情况下不起作用。使用向量、数组、队列……我什么都不懂。

我把我的代码贴在这里,告诉你帮我解决这个问题。

这是我的代码:

//array of TC

typedef array<array<double,4>,4> Matrix;

//single TC

Matrix T1 = 
            -1.0000,   0.0000,  -0.0000,   0.1531,
            0.0000,   0.0000,  -1.0000,   0.1502 ,
            -0.0000,  -1.0000,  -0.0000,   1.0790,
            0 ,       0,        0,   1.0000     ; 

Matrix T2 =   
            -1.0000,    0.0009,    0.0019,    0.1500,
            -0.0021,   -0.4464,   -0.8948,    0.1845,
            0.0000,   -0.8948,    0.4464,    0.8094 ,
             0,         0,         0,    1.0000    ; 

等等......然后,声明容器并填充它:

vector <Matrix> TCS;

TCS.push_back(T1);
    TCS.push_back(T2);
    TCS.push_back(T3);
    TCS.push_back(T4);
    TCS.push_back(T5);
    TCS.push_back(T6);
    TCS.push_back(T7);
    TCS.push_back(T8);
    TCS.push_back(T9);

现在,要获得 double[4][4] 格式的单个矩阵以将其传递给该函数“verifica_punti”(之前写过)我该怎么办?

我有时需要一个 TC,但按 FIFO 顺序(我推送的第一个,我需要弹出并使用。

我该怎么做?因为我写过

 double  temp[4][4] = TCS.pop_back()

double temp[4][4] = TCS[i];

但不正确。

我在 Windows 7 64 位上使用 Visual C++ 2010。

请帮助我 :-( 提前致谢。

【问题讨论】:

std::vector::pop_back() 是一个空函数。它不返回任何东西。您可能希望先使用std::vector::back() 访问最后一个Matrix 【参考方案1】:

typedef array<array<double,4>,4> Matrix;
vector <Matrix> TCS;

你有

//double temp[4][4] = TCS[i]; // Illegal
Matrix m1 = TCS[i]; // legal
const Matrix& m2 = TCS[i]; // legal, and avoid a copy.

现在,你必须改变:

int verifica_punti(punto P, Mat& I, double TC[][4], const double fc[], const double KC[], const double cc[], const double alpha);

int verifica_punti(punto P, Mat& I, Matrix& TC, const double fc[], const double KC[], const double cc[], const double alpha);

【讨论】:

在函数“verifica_punto”中改变它会影响里面的操作吗?或者我可以毫无问题地更改它? 据我所知,您可以毫无问题地更改它。最坏的编译器会抱怨:) 非常感谢...对不起,但我只想问另外一件事:我需要push_back并从头部“弹出”,这样,第一个元素进入,它是第一个弹出的...我该怎么做? @AgentSmith891:您可以查看 FIFO 队列适配器:std::queue。 非常感谢,我的矩阵类型可以用队列代替向量吗?因为我认为它的语法是否相同?【参考方案2】:

std::array&lt; std::array&lt;double,4&gt;, 4&gt;double[4][4] 是不同的类型。前者封装了后者,因此它是可复制的,可以在容器中使用,并且具有几乎相同的界面。但是你不能互换使用它们。

你已经有了你的 typedef,所以使用它:

while (!TCS.empty()) 
    // get the last one
    Matrix m = TCS.back();

    /* do stuff with m */

    // pop the last one out
    TCS.pop_back();

【讨论】:

使用 std::array, 4> 而不是经典,允许函数像已经做的那样使用“m”? 您还需要将函数声明更改为采用Matrix 非常感谢...对不起,但我只想问另外一件事:我需要push_back并从头部“弹出”,这样,第一个元素进入,它是第一个弹出的...我该怎么做? @AgentSmith891 然后使用std::dequestd::queue

以上是关于如何使用向量中包含的 double[4][4] 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .Net 4.0 中包含的 HttpClient 类将文件上传到在 IIS Express 中运行的 Asp.Net MVC 4.0 操作

如何找到 JavaScript 数组中包含的最大数?

为了能够检查向量中包含的类的数据成员,我需要在 autoexp.dat 中输入啥?

通过更改代码格式来计算结构向量中包含的双变量的平均值的不同结果?

如何从数据数组中删除对象(核心数据)

Android Studio 中的异常解析向量资源