2012-11-27 102 views
-2

是否有可能重載operator +C++,重載操作符+矩陣

template <typename U> 
Mat <T> operator + (const Mat <U> &A); 

以下矩陣運算

Matrix (1,1) + scalar  = scalar 
scalar + Matrix (1,1)  = scalar 
Matrix(1,1) + Matrix(1,1) = scalar 

和語法(或類似)?

template <typename T, typename U> 
T operator + (const Mat <U> &M) const; 

更新問題:

尺寸作爲模板參數:

template <typename T, typename U, const unsigned int TDim> 
T operator + (const Mat <U> &M, TDim <dim>) const; 

與專業化爲昏暗= 1

template <typename T, typename U> 
T operator + (const Mat <U> &M, TDim <1>) const; 
+2

是的。你試過了嗎? –

回答

1

不除非矩陣的尺寸是製作成Mat的模板參數,並且你部分地專門化了t他Mat模板爲1x1矩陣。

或者,您可以返回Matrix(1,1),然後轉換爲標量。如果你這樣做了,你將不得不接受運行時轉換失敗的可能性。

1

可以過載operator +做任何你喜歡的事情。主要問題是,你如何定義矩陣和標量的加法?即使您將標量添加到1x1矩陣中,由於1x1矩陣仍然是一個向量,而不是標量,所以該操作仍未被傳統數學定義。

+0

「操作仍未定義」 - 是嗎?在數學上,將1×1矩陣當作標量處理完全沒有問題。事實上,我相信這是經常完成的。對於向量,至少沒有這樣的問題:從數學的角度來看,1元向量與標量相同,n元向量相當於n×1矩陣。事實上,這意味着1×1矩陣是一個標量。 –

+0

@Konrad從數學上來說,你的意思是工程上的? – Yakk

+0

@Yakk不,我不知道。這是我在學校和大學的數學課上學到的。雖然我認識到這可能取決於實際的定義,但數學家並沒有重新定義核心概念及其操作以適應其特定目的。 –

1

如果我想做到這一點(和自動轉換這樣既可以是危險和惱人的),我反而專門Matrix<1,1,T>operator T()(或使用enable_if型的魔力,所以我就不用做樣板)。

然後標量加法將Matrix轉換爲T作爲T,而不是Matrix中的顯式覆蓋。另外,您的1x1 Matrix可以直接轉換爲隱含的T,您似乎也希望這樣做。另一方面,另一個非常自然的對應是從標量到標量時間的任何大小的標識矩陣,反之亦然。 1x1矩陣案例是這方面的一個特例,因爲所有1x1矩陣都是標量矩陣乘以標量。

因此,轉換(對於標量矩陣乘以標量的標量)可能會有一定意義,並且需要一些覆蓋。相反的轉換更危險,因爲在編譯時進行檢查並不合理,所以可能會失敗。