具有2个未知尺寸和1个已知尺寸的3D矢量
我的程序接收2个尺寸作为命令行参数(M为宽度,N为高度)。只要M和N在[3-10000]之间,我就必须处理任何维度。我想要计算一个矩阵中的值(用3D矢量表示),但我想保留以前的值来计算新的值(这就是为什么一个维度只有两个深度:0 =旧的,1 =新)。具有2个未知尺寸和1个已知尺寸的3D矢量
这会给我一个像matrix[M][N][2]
或matrix[2][M][N]
的结构。我没有偏好(以较简单为准,可能是后者)。
由于M和N仅在运行时是已知的,我不能用简单的数组(以及我可以用双***改编,但我不想惹内存分配)
我应该使用3个维度中的每个维度的矢量还是仅用于那些未知的维度?换句话说,我应该使用一个简单的数组为0 =旧,1 =新和向量M和N?
无论选择哪个,我都努力使其工作。我如何创建并初始化它?
我应该为每个3维使用
vector
吗?
是的,你应该。
当标准库为您提供功能时,编写自己的代码用于内存分配和释放没有任何优势。
无论选择哪一种,我都努力使其工作,我如何创建并初始化它?
假设你已经找到了如何在命令行中得到M
和N
,你可以使用:
std::vector<int> d1(N, 0);
std::vector<std::vector<int>> d2(M, d1);
std::vector<std::vector<std::vector<int>>> matrix(2, d2);
你可以合并到这一个也行:
std::vector<std::vector<std::vector<int>>> matrix(2, std::vector<std::vector<int>>(M, std::vector<int>(N, 0)));
我更喜欢第一种方法。跟随正在做的事情更容易。
有了这个,我可以使用矩阵作为矩阵[i] [j] [0]'或者是矩阵[0] [i] [j]'? '我'是'M','j'是'N'? 随着它被宣布的方式,我不知道它是什么方式,当我用方括号 – dominicbri7 2015-04-02 18:51:45
第二项 - '矩阵[0] [我] [J]'。 – 2015-04-02 18:52:10
一旦我得到M和N,是否有可能通过这种方式做一种typedef? 我想使函数初始化并将其打印到控制台,这将是很好的能够使用自定义的typedef,而不是每次向量载体,如'void myFunc(myCustomVectorMatrixType mat)',你会得到什么我的意思是? – dominicbri7 2015-04-02 18:55:44
如果你只使用两个矩阵我会使用长度为2的数组:
std::array<std::vector<std::vector<int>>, 2 > matrices{ {
std::vector<std::vector<int>>(M, std::vector<int>(N, 0)),
std::vector<std::vector<int>>(M, std::vector<int>(N, 0))
} };
用法:
int a=matrices[0][M][N];
虽然我觉得你的程序将一些类型别名受益。下面是一个完整的例子:
#include <vector>
#include <array>
#include <iostream>
template<class T>
using Row = std::vector <T> ;
template<class T>
using Matrix = std::vector < Row<T> > ;
std::array<Matrix<int>, 2 > matrices;
int main()
{
size_t M, N;
int d;
std::cin >> M;
std::cin >> N;
std::cin >> default;
matrices.fill(Matrix<int>(M, Row<int>(N,d)));
for (auto& r : matrices[0]){
for (auto& e : r) {
std::cout << e << " ";
}
std::cout << std::endl;
}
return 0;
}
如果你的数据类型是简单的算术数据类型,如整型,浮点,双,复合等,你可以使用任何众多矩阵和线性代数库。有boost :: numeric :: ublas,Eigen,LAPACK,OpenCV等。我对Eigen有很好的经验,并且会推荐。 – 2015-04-02 18:41:44