2010-06-05 55 views
2

是的,它已被做了一百萬次之前,但該死的我想再做一次。我正在爲C++編寫一個簡單的矩陣庫,目的是爲了做到這一點正確。我遇到過一些在數學上相當明顯的東西,但對強類型系統來說並不那麼明顯--1x1矩陣只是一個數字。爲了避免這種情況,我開始沿着作爲向量組合的矩陣的毛髮路徑走,但也偶然發現兩個向量相乘在一起的事實可能是數字或二元組,這取決於兩者的方向。靜態打字和寫一個簡單的矩陣庫

我的問題是,什麼是正確的方式來處理這種情況在強類型的語言,如C + +或Java?

+0

1x1矩陣不只是一個數字(標量)。從概念上講,1x1矩陣是1維的大小,標量只是一個量級(無維度)。向量乘法的結果不取決於向量的方向,而取決於操作。點積(內積,交換)是標量(投影的幅度),交叉積(外積,不交換)是矢量(兩個矢量的法線)。您可以用矩陣表示矢量和矢量運算,但矩陣不是由矢量組成的。有10個測試來查看矩陣是否在向量空間中。 – charstar 2010-11-10 22:55:49

回答

2

如果你不擔心SIMD優化等,那麼我會認爲最好的方法是建立一個模板化的tensor。選擇你的最大張量尺寸,然後你可以做這樣的事情:

typedef Tensor3D< float, 4, 1, 1 > Vector4; 

等等。數學如果得到正確執行,將會適用於所有形式的「矩陣」和「矢量」。畢竟,兩者都只是張量的特例。

編輯:知道模板的大小其實很簡單。添加一個GetRows()等函數,你可以在實例化時返回你傳遞給模板的值。

template< typename T, int rows, int cols > class Tensor2D 
{ 
public: 
    int GetRows() { return rows; } 
    int GetCols() { return cols; } 
}; 
+0

說到模板,我試圖找出如何正確實現一個分裂的.h/.cpp文件,但充滿了鏈接錯誤。 http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12揭示了一些光明,但我仍然有點不清楚;這是不可能的嗎?他們必須在同一個地方申報和實施? – duckworthd 2010-06-05 08:03:50

+0

@duck出於所有實際目的,這是不可能的。 – fredoverflow 2010-06-05 08:12:38

+0

@duckworthd:你可以在一個單獨的文件中實現代碼,但是你需要在你的'.h'文件末尾加上'#include'這個單獨的文件。然而,這並不像爲例如具有單獨的'.h'和'.cpp'文件那樣。一類。 – MKroehnert 2010-06-05 08:13:13

3

東西是在 數學相當明顯的,但不那麼明顯的 強類型的系統 - 即 一個1x1矩陣僅僅是一個數字的事實。

這是有爭議的。一個硬核數學家(我不是)可能會反對它,他會說一個1x1矩陣可以看作是同構(或類似的東西)到一個標量,但它們在概念上是不同的東西。只有在一些非正式的意義上,「1x1矩陣是一個標量」(類似,雖然更強一些,沒有虛部的複數是真實的)。

我不認爲這種對應應該體現在強類型語言中。我不認爲這是典型的實現(複雜或矩陣),例如。 Java Apache Commons Math。例如,一個具有零虛部的複合體不是一個數字(來自類型POV--它們不能被鑄造成另一個)。

在矩陣的情況下,通信更具爭議性。我們是否應該能夠乘以兩個尺寸的矩陣(4x3)x(1x1)?如果我們把第二個看作一個標量,那麼它是有效的,但不是一個矩陣,因爲它違反了矩陣乘法限制。我相信Commons堅持。

在弱類型語言(如Matlab)中,它將是another story

+0

「我們應該能夠乘以兩個尺寸的矩陣(4x3)x(1x1)?」 - 如果第二項是標量,則可以,但如果是矩陣,則可以。這不符合矩陣乘法的規則。 – duffymo 2010-06-05 12:57:58

+0

@duffymo:這是我的觀點 – leonbloy 2010-06-05 13:33:37

+0

+1:我在@leonbloy上。我還建議您確保允許0x0矩陣,這將防止矩陣算法(例如1x1矩陣的下三角形)中的某些轉角情況成爲問題。 – 2010-06-06 12:53:25

0

我的建議是?不要擔心1x1的情況,晚上睡覺。你不應該擔心任何使用突然決定使用你的庫來模擬一堆數字爲1x1矩陣並抱怨你的實現。

沒有人解決這些問題將是如此愚蠢。如果你足夠聰明地使用matricies,你就足夠聰明,可以正確使用它們。

至於標量引入的所有排列,我會說你必須說明它們。作爲一個矩陣庫用戶,我希望能夠將兩個矩陣乘以一起得到另一個矩陣,矩陣由(列或行)向量得到向量結果,標量乘以矩陣得到另一個矩陣。

如果我乘以兩個向量,我可以得到標量(內積)或矩陣(外積)。你的圖書館最好把它們給我。

這不是微不足道的。這一切都是由其他人完成的,但爲自己的努力而努力。