2013-04-04 53 views
3

什麼會更好地使用作爲一種方式來存儲矩陣值?什麼是更好的Matrix4x4類設計C++新手

float m1,m2,m3 ... ,m16 

float[4][4]. 

我第一次嘗試浮動[16]但是,當IM調試和測試VS不會顯示什麼是數組裏面:(可以實現一個cout和嘗試從閱讀答案控制檯測試應用程序。

然後我試圖使用浮動M1,M2,M3,等下測試和調試的值可以在VS讀因此它似乎更容易使用。

我的問題是因爲即時通訊相當新的C + +什麼是更好的設計?

我發現float m1,m2 ... ,m16更容易在調試時使用。

也願意,如果有人能夠從經驗說還是有基準數據什麼都有較好的表現我的直覺說,應該沒有真正的問題,因爲矩陣數據應當設置在內存中的權利一樣嗎?

編輯: 一些更多的信息其列主要矩陣。 據我所知,我只需要一個4x4矩陣的視圖轉換管道。 所以沒有更大的,所以我有一些不變的價值。

忙着寫一個簡單的軟件渲染器,以此來了解C++,並得到一些更多的經驗和學習/提高我的線性代數的技巧。可能只會去每個片段着色和一些簡單的光照模型,到目前爲止,我已經看到4x4矩陣是我需要渲染的最大的。

編輯2: 發現爲什麼我不能讀取數組數據它是我使用的浮點指針,調試菜單隻顯示指針值我發現了一種方法來查看數組值,指針,n其中n =您想要查看的元素。

大家回覆謝謝,我現在將使用Vector4 m [4]答案。

+0

請發表代碼 – 2013-04-04 11:20:48

+0

偶數組值可以在VS調試中看到。再次檢查 – 2013-04-04 11:20:57

+0

您可以自定義autoexp.dat以指示調試器顯示您矩陣所需的內容。這就是說...最好的實現(從性能的角度來看)不能沒有更多的細節決定。你將如何使用這個矩陣?您將應用哪些操作?你會支持哪些算法?通常「分裂」變量是相當不錯的,但是......如果它真的是一個瓶頸...配置文件配置文件,然後測量。 – 2013-04-04 11:22:47

回答

2

您應該考慮與float [4]成員Vector4成員,Matrix4Vector4 [4]成員。使用operator [],您有兩個有用的類,並保留訪問元素的能力:[i][j] - 在大多數情況下,如果不使用virtual方法,元素數據將是連續的。

還可以受益於載體(SIMD)指令這種方式,例如,在Vector4

union alignas(16) { __m128 _v; float _s[4]; }; // members 

inline float & operator [] (int i) { return _s[i]; } 
inline const float & operator [] (int i) const { return _s[i]; } 

Matrix4

Vector4 _m[4]; // members 

inline Vector4 & operator [] (int i) { return _m[i]; } 
inline const Vector4 & operator [] (int i) const { return _m[i]; } 
+0

是的,我在更加努力的思考後刪除了我的評論。良好的工作:) – 2013-04-04 11:56:15

+0

如果您允許SIMD支持,請不要訪問個別元素。這是一個巨大的性能危害,選擇更多SIMD友好的方式來獲取和設置個別元素,通過調整操作和選擇。 – 2013-04-04 12:13:55

+0

@JasperBekkers - 它只是需要明智的使用。即用於矢量變換的點積。我寧願有兩個選項可用。 – 2013-04-04 12:19:04

0

16浮點解是細只要代碼沒有按「T演變(它是保持麻煩和它是不是真的可讀)

浮子[4] [4]是一種更好的設計(大小parametrizati方面),但你必須理解指針的概念。

+0

定義「好」!如果你想迭代元素呢? – 2013-04-04 11:35:12

+0

@OliCharlesworth我想他的意思是「根據你的問題很好」(**表演**)。如果矩陣大小是固定的,並且代碼必須真正優化,那麼直接變量訪問**比任何(double ...)指針間接更快**(這就是爲什麼LL 3X3和4X4矩陣如此實現的原因)。 **這並不意味着它是可讀的**,_ performance不是可讀性的好朋友。 – 2013-04-04 11:39:43

+0

公平點。取決於用例。 (我的意思是「很好的解決方案」是「當你是一個初學者時開發的一小段時間」) – lucasg 2013-04-04 11:43:52

-1

對矩陣元素使用單獨的變量可能被證明是有問題的。在處理像100x100這樣的大矩陣時,你打算做什麼?

Ofcourse您需要使用一些陣列狀的結構,我強烈建議你至少使用數組

+0

嗯,這是有點危險(特別是對於C++初學者):V.push_back(v)是安全的,但V [i] .push_back(float f)可以引發異常(取決於V [i] .capacity )。 – lucasg 2013-04-04 11:42:14

+0

他也在詢問**表演**。 float []可以像具有多個變量的_naive實現一樣快,但是關於std :: vector,您可以確定它更慢_。 – 2013-04-04 11:47:03

+0

代替使用push_back的矩陣,可以在構造函數 – 2013-04-04 11:48:42

1

float m1, m2 .. m16;變得很尷尬,處理,當涉及到使用循環貫穿東西迭代用。使用某種數組要容易得多。最有可能的情況是,除非您真正編寫內聯彙編程序或使用SSE內聯函數,否則編譯器會在您使用循環時像「手寫代碼」一樣生成AT LEAST作爲有效代碼。

+0

經驗法則:'X m1,m2;'沒問題,'X m1,m2,m3,m4;'(和更多)必須變成一個數組。 'X m1,m2,m3'的情況是不確定的。 – 2013-04-04 12:02:26

0

我會使用16個浮點數組,如float m[16];,唯一的原因是使用Matrix4fv後綴函數很容易將它傳遞給像openGL這樣的庫。

2D陣列等float m[4][4];應該在存儲器還可以被配置相同地float m[16](見May I treat a 2D array as a contiguous 1D array?),並使用這將是更方便的,只要具有[row][col](或[col][row]我不知道這是在OpenGL方面正確)索引(比較m[1][1]m[5])。

相關問題