簡體   English   中英

犰狳矩陣轉置

[英]Armadillo matrix transpose

我有一個巨大的m * n個矩陣A(其中的行數m遠遠大於n列的數目),其被存儲在我的C ++程序作為armadillo mat類型。 現在我有一個向量w ,我必須為其計算w=wA*A^T*w ,其中A^T表示矩陣A的轉置。

由於矩陣A非常大且消耗大量內存,因此犰狳w=wA*At()*w的常規快速方法不起作用,因為在這種情況下犰狳消耗了大量內存(參見github )。 他們解決此問題的方法是引入函數inplace_trans( A, method ) ,該函數可以使用方法“ lowmem”,該方法消耗較少的內存,但需要更多的時間。

現在我的問題是, inplace_trans( A, method )是一個無效函數,因此在計算新w之前,我必須先創建矩陣的副本:

mat Q = A;
inplace_trans(Q, 'lowmmem');
w=w-A*Q*w;

但是,這當然不是理想的結果,因為我需要矩陣的完整副本,而我首先要避免這樣做(RAM問題!)。 因此,如何才能以有效的方式(快速且低內存需求)獲得矩陣的轉置,以計算新的w

如果我這樣做是明智的

mat A(m,n); //huge matrix, initialized before
vec temp(m);
temp.fill(0.0);
for (unsigned long int ii=0; ii<m; ii++){

    for (unsigned long int ll=0; ll<m; ll++){
        temp(ii)+=dot(A.row(ii),A.row(ll))*w(ll);
    }
}
w=w-temp;

我必須對行數m進行兩次迭代,這非常昂貴。

編輯:到目前為止,最快的方法如下:

vec temp(m);
inplace_trans(A, "lowmem");
temp = A * w;
inplace_trans(A, "lowmem");
temp = A * temp;

我必須轉置矩陣兩次,因為此后我需要將其恢復為原始狀態。 我不能相信這應該是最快的方法,因為它需要進行很多操作,恕我直言。

在編輯中,您已經正確地暗示,從復雜度的角度來看,當然最好執行兩個矩陣向量乘法,而不是先計算A*At() ,然后將結果應用於w 但是,您的問題似乎是必須兩次轉置矩陣。

如果之后不需要矩陣以未轉置的形式返回,則該問題的簡單解決方案是僅轉置整個方程: w = w - AA^T w <==> w^T = w^T - w^TAA^T 在這種情況下,您可以先應用A ,然后再應用At() 如果您能以某種方式將w定義為行向量,那么就等於

vec temp = w * A;
inplace_trans(A, "lowmem");
temp = temp * A;
w -= temp;

從概念上講,行向量和列向量之間的存儲應該沒有差異,元素應該在內存中都是連續的。 您將不得不看看armadillo在行向量和列向量之間的顯式區別是什么,但是afaik向量只是一維設置為1的矩陣。 無論如何,這種考慮在向量層面上比在矩陣層面上要嚴格得多。

您可以直接計算A*At()*w ,從而減少工作量,大大減少緩存丟失,並且如果逐個元素地進行操作,則僅復制一份A 我不知道犰狳提供了哪些功能來幫助您快速實現這一目標。 但是簡單地訪問矩陣的行應該足以使其實用而不用過多的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM