2015-04-02 100 views
2

我的程序接收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?

无论选择哪个,我都努力使其工作。我如何创建并初始化它?

+0

如果你的数据类型是简单的算术数据类型,如整型,浮点,双,复合等,你可以使用任何众多矩阵和线性代数库。有boost :: numeric :: ublas,Eigen,LAPACK,OpenCV等。我对Eigen有很好的经验,并且会推荐。 – 2015-04-02 18:41:44

回答

4

我应该为每个3维使用vector吗?

是的,你应该。

当标准库为您提供功能时,编写自己的代码用于内存分配和释放没有任何优势。

无论选择哪一种,我都努力使其工作,我如何创建并初始化它?

假设你已经找到了如何在命令行中得到MN,你可以使用:

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

我更喜欢第一种方法。跟随正在做的事情更容易。

+0

有了这个,我可以使用矩阵作为矩阵[i] [j] [0]'或者是矩阵[0] [i] [j]'? '我'是'M','j'是'N'? 随着它被宣布的方式,我不知道它是什么方式,当我用方括号 – dominicbri7 2015-04-02 18:51:45

+1

第二项 - '矩阵[0] [我] [J]'。 – 2015-04-02 18:52:10

+0

一旦我得到M和N,是否有可能通过这种方式做一种typedef? 我想使函数初始化并将其打印到控制台,这将是很好的能够使用自定义的typedef,而不是每次向量载体,如'void myFunc(myCustomVectorMatrixType mat)',你会得到什么我的意思是? – dominicbri7 2015-04-02 18:55:44

3

如果你只使用两个矩阵我会使用长度为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; 
}