2013-07-22 44 views
2

我正在做一個矩陣庫作爲一個學習項目,並且這樣做我已經重載了*運算符來執行矩陣乘法。我也重載它來處理標量乘(將矩陣的每個元素乘以一個double)。我的問題是當下面的代碼運行時,test2和test都被修改,這是不希望的。乘法運算符重載修改原始變量(C#)?

Matrix test2 = 2 * test; 

我敢肯定,這是一個事實,即矩陣是一類,並因此被引用傳遞,但不改變矩陣的結構(東西我不認爲將是合適的一個問題,當嘗試似乎沒有工作),我看不出解決這個問題的任何方法。我將如何解決這個問題?

的實際操作者的代碼是

public static Matrix operator *(Matrix m1, double c) 
{ 
    Matrix ret = m1; 

    for (long i = 0; i < ret.Width; i++) // Iterate over the rows. 
    { 
     for (long p = 0; p < ret.Height; p++) // Iterate over the columns. 
     { 
      ret[i, p] *= c; 
     } 
    } 

    return ret; 
} 

回答

5

你不應該修改與你的代碼中存在的矩陣。簽名尖叫它正在創建一個Matrix並返回它。

我不確定你的拷貝方法/構造函數是什麼,但是不需要賦值m1ret;你應該做一個副本m1,修改副本,並返回副本,留下m1不變

public static Matrix operator *(Matrix m1, double c) 
{ 
    Matrix ret = m1.Clone(); //not sure what your "copy" method is 

    //do the multiplication on ret 

    return ret; 
} 
+0

我現在已經創建了一個這樣做的方法,但是有沒有辦法避免每次需要複製值時調用xxxx.Clone()? I.E.當使用ret = m1時;相當於ret = m1.Clone(); – Musiphonix

+0

唯一的方法就是將'Matrix'實現爲一個值類型'struct'。這可能會影響您目前如何使用該類型。 (谷歌「可變結構是邪惡的」) –

1

由於Matrix是引用類型,ret = m1不會使你的輸入變量的副本,你最終修改它。

對這個問題的適當的解決方案是做一個m1的深層複製並修改它。例如:

Matrix ret = m1.MakeCopy(); // you need to define this 

// and now you are free to modify ret as much as you like