2011-03-18 62 views
4

我已經閱讀了一些關於C中動態增長數組的內容,但我看不到如何創建一個2D增長數組(如在MATLAB中)。我有一個函數來爲某些圖像處理構造一個數組,但是我不知道這個數組(cols和rows)的大小是多少。我如何創建這個?C++ 2D增長數組像MATLAB一樣

我讀了一些關於malloc和realloc的內容。這些功能對於這個問題是便攜的或有用的。

編輯:已解決,使用Armadillo library,一個C++線性代數庫。

+0

查找專爲矩陣分析而設計的庫。 C++更通用,標準庫中沒有包含這樣的內容。 – 2011-03-18 19:38:05

+0

+1 for armadillo解決方案 – nkint 2012-02-14 12:36:57

回答

0

簡單的是與指針

int nrows = 10; 
int ncols = 5; 

double* matrix = new double[mrows*ncols]; 

然後,就好像它是一個二維數組like您可以訪問它。

所以,如果你想matrix[row][col],你會做

int offset = row*ncols+col; 
double value = matrix[offset]; 

另外,如果你想Matlab的像在C++矩陣的舒適性,考慮Armadillo

+1

他正在尋找一個動態調整大小的解決方案。 – pmr 2011-03-18 19:45:50

+0

我認爲他的「動態」是在編譯時創建一個未知大小的二維數組?我想我只是誤解了它。無論如何,犰狳可能是他正在尋找的東西。它被設計成用於C++的matlab -esq矩陣庫。 – Chris 2011-03-18 20:04:55

+0

我正在使用犰狳,但我無法調整一個arma :: mat變量..我使用重塑方法,但這隻能調整行大小,如果我嘗試調整cols大小我有一個錯誤:「run-時間錯誤:Mat :: operator():越界「.. – matiasfh 2011-03-19 19:43:22

1

如果您正在進行圖像處理,您可能需要使用matrixopencv的陣列類型。

0

通過增大像Matlab一個數組,我「M假設你的意思做這樣的事情:

mat = [mat; col] 

,您可以調整C++中的矩陣,而不是用乾淨的語法類似上面。

例如,您可以使用std::vector<std::vector<T>>來表示您的矩陣。

std::vector<std::vector<int> > mat; 

然後添加一列:

for (int i=0; i<mat.size(); i++) mat[i].push_back(col[i]); 

或添加一行

mat.push_back(row); // row is a std::vector<int> 
0

C++不具有每本身標準矩陣類。我認爲這樣的班級有太多的不同用途,因此不可能制定出一種適合所有人的解決方案。在Stroustrup的書(The C++ Programming Language(第三版))中有一個例子和討論,關於數值矩陣的簡單實現。

但是,對於圖像處理來說,使用現有的庫會更好。

你可能會看看CImg。我之前使用過它,發現它很快並且有據可查。

如果你在一臺AMD機器上,我知道AMD有一個優化的圖像處理庫,Framewave項目​​。另外,如果你習慣了MATLAB風格的代碼,那麼你可能想看看it++。 我認爲項目的目標是儘可能地與MATLAB相似。

0

+1對於OpenCV,在進行圖像分析時特別有用,因爲它可以抽象出底層的數據類型(GRAYSCALE,RGB等)。