2014-06-17 46 views
2

我使用Eigen和大矩陣,我正在考慮如何優化我的代碼,重點是減少動態內存分配。Eigen中沒有拷貝乘法

我試圖乘以兩個矩陣。這些矩陣有時會變化一些,但它們的大小保持不變。

我想看到乘法輸出到預定義的矩陣(這將有內存已分配給它)。

所以這裏的我在做什麼的例子:

Eigen::MatrixXd left, right,result; 
// ... 
result = left * right; 
// ... left and right values change a little 
result = left * right; 

而且我正在尋找一個解決方案,將是這樣的:

void Multiply(
    Eigen::MatrixXd const& left, 
    Eigen::MatrixXd const& right, 
    Eigen::MatrixXd&  result); 

    void Example() 
    { 
    Eigen::MatrixXd left, right, result; 
    // ... 
    Multiply(left, right, result); 
    // ... 
    Multiply(left, right, result); 
    } 

目的基本上是重複使用因爲在理論上它不應該改變尺寸。我正在考慮使用operator*=,但我有點意識到它仍然需要一箇中間矩陣來進行計算。

+0

你檢查'結果=左* right'實際上重新分配時的結果已經有了合適的尺寸? –

回答

2

result = left * right分配一個臨時矩陣來保存乘法結果,將乘積評估爲臨時矩陣,然後將結果從臨時矩陣複製到result。這是爲了處理像A = A * B這樣的陳述,其中需要臨時矩陣。

如果您知道結果與產品中的矩陣不同,則可以編寫result.noalias() = left * right。在這種情況下,Eigen不會使用臨時矩陣。在本徵混淆

更多的解釋是http://eigen.tuxfamily.org/dox/group__TopicAliasing.html

+0

這是否意味着'operator *()'具有不同的返回類型?這怎麼可能? – Arthur

+2

'operator *()'返回一個表達式對象,它代表產品的代理,但它不評估產品。當產品表達式對象被分配給矩陣時,評估步驟僅在'operator =()'內完成。在C++中搜索「表達式模板」或「懶惰評估」以獲取更多信息。 –