2013-10-14 132 views
13

我是新來的使用犰狳,儘管嘗試/搜索相當多,但不能得到以下內容。犰狳C++:矩陣初始化從數組

有兩個巨大的(動態)數組(不是向量),我需要執行關聯。我決定爲此使用犰狳。我知道如何使用向量初始化arma :: mat,但是我可以使用數組來做到這一點嗎?我不理解,因爲我在documentation中沒有看到任何提及。 我試圖避免使用矢量內部設計的原因。 我嘗試使用示例數組手動初始化每個元素(作爲一個愚蠢但起點)。類似下面的代碼不起作用。

using namespace std; 
using namespace arma; 

mat A(SIZE, 1), B(SIZE, 1); 

for(int i = 0; i < SIZE; i++) 
{ 
    A << v[i] << endr; 
    B << c[i] << endr; 
} 

cout << "A: " << endl; 
A.print(); 
cout << "B: " << endl; 
B.print(); 

對於輸入陣列V = {1,2,0,-1,0.9}和c = {0,0.5,1,-2,-5}。輸出將是:

A: 
     0 
B: 
    -5.0000 

這是可以理解的。 任何解決與數組初始化arma :: mat或arma :: colvector?提前致謝!

+2

,除非你打算在一次初始化所有的元素,不要使用<<操作(如: A << 4 << 5 << 9)。可以使用循環來設置元素,也可以使用下面由Martin J描述的更高效的aux_mem構造方法。 – mtall

+0

是的,我意識到<<操作符不是這樣。 aux_mem工作。謝謝! –

回答

7

假設你的陣列V和C是雙數組,你可以使用AUX內存構造函數:

the armadillo doc

  • 墊(aux_mem *,n_rows,n_cols,copy_aux_mem = true,strict = true)

    使用來自可寫輔助存儲器的數據創建一個矩陣。默認情況下,矩陣分配自己的內存並從輔助內存中複製數據(爲了安全起見)。但是,如果copy_aux_mem設置爲false,則矩陣將直接使用輔助內存(即不復制)。這會更快,但除非您知道自己在做什麼,否則可能會很危險!

僅當copy_aux_mem設置爲false(即矩陣直接使用輔助存儲器)時,嚴格變量纔會生效。如果strict設置爲true,則矩陣將在其生命週期內被綁定到輔助存儲器;矩陣中元素的數量不能改變(直接或間接)。如果strict設置爲false,則矩陣在其生存期內不會被綁定到輔助存儲器,即矩陣的大小可以改變。如果請求的元素數量與輔助存儲器的大小不同,則將分配新的存儲器並且不再使用輔助存儲器。

  • 墊(常量aux_mem *,n_rows,n_cols)

通過複製從只讀輔助存儲器數據創建的矩陣。

這意味着你可以通過複製源數據像這樣創建矩陣:

mat A_Copy(v, SIZE, 1); 
mat B_Copy(c, SIZE, 1); 

或者你其實可以重用你已經分配給您的數組的內存來創建只讀矩陣,像這樣的:

mat A_InPlace(v, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true); 
mat B_InPlace(c, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true); 

如果使用矢量

vec A_Vec_Copy(v, SIZE); 
vec B_Vec_Copy(c, SIZE); 
這變得更簡單

或者:

vec A_Vec_InPlace(v, SIZE, false, true); 
vec B_Vec_InPlace(c, SIZE, false, true); 
+0

我們如何使用C++ 11初始化列表? – qed