2015-04-02 71 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; 
}