2013-05-06 91 views
1

我有一個類定義尺寸爲m×n的像這樣的矩陣:矩陣類C++如MATLAB操作過載

class Matrix{ 
    protected: 
    int m; 
    int n; 
    double* mat: 
    public: 
    // accessors, constructors, destructors, etc. 
    void assignvalue(int, int, double); 
} 

現在,如果我需要分配在I位置的值,J我有一個函數assignvalue這需要位置i,j並且執行魔術併爲該位置分配一個雙倍值。然而,這將是非常好的,如果你喜歡在MATLAB或R.

mymatrix(i,j) = 1.0; 

你能給我什麼運營商(S)我需要重載一個提示我可以分配一個值?謝謝。

+0

Morwenn的回答是正確的,但我的經驗法則是儘量不重新發明輪子。找到一個已經提供線性代數運算的庫。最近,我一直在使用Eigen3,我對此非常滿意。 – 2013-05-07 11:45:02

+0

這是一個論文項目,問題的一部分是重新發明輪子。但感謝您的建議。這說得通。 – 2013-05-07 17:34:24

+1

當然!每個人都應該重新發明一次,以瞭解它是如何工作的。但不適用於生產代碼。 – 2013-05-09 23:33:37

回答

2

假設你m代表你的矩陣和n的高度表示寬度,超載operator()這種方式應該做的伎倆:

double& Matrix::operator()(size_t i, size_t j) 
{ 
    return mat[i*m+j]; 
} 

const double& Matrix::operator()(size_t i, size_t j) const 
{ 
    return mat[i*m+j]; 
} 

這樣,你可以寫這樣的事情:

void f(Matrix & mymatrix) { 
    mymatrix(2, 3) = 5.0; // Calls the first function 
    // ... 
} 
void f(Matrix const & m) { 
    double a = m(1, 5); // Calls the second one 
    //... 
} 
+0

感謝您的快速回復。這有助於我從矩陣中獲得價值。像a = mymatrix(i,j);但我正在尋找相反的東西。更像mymatrix(i,j)= a; – 2013-05-06 22:21:19

+0

它也有效,因爲函數有兩個版本:'const'和non-'const'。 'const'將用於檢索值,而另一個將用於設置它。 – Morwenn 2013-05-06 22:22:19

+0

請注意,評論'/ /調用第二個'是不正確的。使用調用成員函數的對象的類型完成調度,在這種情況下,在兩條使用行中都是相同的。假設第一個編譯時,'mymatrix'是類型爲'Matrix'的非const對象,因此第二行將調用完全相同的運算符 – 2013-05-06 22:57:22