如何使用向量中包含的 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< std::array<double,4>, 4>
和 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::deque
或std::queue
。以上是关于如何使用向量中包含的 double[4][4] 数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 .Net 4.0 中包含的 HttpClient 类将文件上传到在 IIS Express 中运行的 Asp.Net MVC 4.0 操作
为了能够检查向量中包含的类的数据成员,我需要在 autoexp.dat 中输入啥?