
3Dのプログラムで行列を扱ってます。
行列の掛け算を行おうとすると
for(i= 0;i<4;i++){
for(i= 0;i<4;i++){
for(i= 0;i<4;i++){
詳細は省きます。。。
}
}
}
のように、3重のfor文の中で掛け合わせていたと思います。
この部分、むかーしどこかのサイトで、
無駄な部分を処理せずに(例えば必ず0の要素の個所は、最初から演算させない等)
高速な処理をさせているロジックを見た事があったのですが、
そのようなに、上記の計算よりは、無駄がなく処理の高速化が望める
アルゴリズムを知りたいのです。
で、よく使われる平行移動行列は
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| dx dy dz 1 |
で、それを対応させる行列が
| 00 01 02 03 |
| 10 11 12 13 |
| 20 21 22 23 |
| dx dy dz 44 |
という位置関係になっていると思うのですが、
諸事情により、私が扱う行列の配置は、上記の行列の変数を利用すると
| 00 10 20 dx |
| 01 11 21 dy |
| 02 12 22 dz |
|この行は取り扱わない|
という行列になっています。(各要素の位置が反転しています)
さらに、一番下の行は取り扱わないので(数値が0だから最初から扱う必要がない)
4*4ではないのですが
| 00 10 20 dx | | 00 10 20 dx |
| 01 11 21 dy | * | 01 11 21 dy |
| 02 12 22 dz | | 02 12 22 dz |
という計算になります。
わかりにくい説明ですが、この行列の計算を高速化させる
アルゴリズムがありましたら、ぜひご教授ください。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
4*4のマトリックスの積を計算させるのですね.
たぶん大して速くはならないとは思うのですが,
書き下してしまうという手もあります.
つまり,
|a b| |e f| |ae+bg af+bh |
| | x | | = | |
|c d| |g h| |ce+dg cf+dh |
という具合です.
あらかじめ手で計算して,ソースに埋め込んでしまいます.
あまり姑息なことをやるよりも,昨今は「最適化コンパイラ」にお任せしたほうが,速くなるケースもありますので,ケースバイケースです.つまり,ご質問のforループがかならずしも遅いとは思いません.
少しでも速くしようと思って,いろいろ工夫しても
結果として大して速くならずがっかりすることもよくあります.
No.4
- 回答日時:
#3です.
いい忘れましたが,#3の方法では
直接配列のアドレスがかかれるので,計算が遅くなるケースもあります.
CPUの内部では,インデックスアドレッシングといいまして,forループの添え字のようなものを用いたほうが速く配列にアクセスできる場合もあるからです.
蛇足でした.
No.2
- 回答日時:
boostというC++のライブラリがあるようです。
http://boost.cppll.jp/HEAD/index.htm
疎な行列向けの関数を使うにはこれをインクルードすればいいみたいです。
#include <boost/numeric/ublas/matrix_sparse.hpp>
参考URL:http://boost.cppll.jp/HEAD/libs/numeric/ublas/do …
No.1
- 回答日時:
アルゴリズムでは無いですが
1.行列積の部分をインラインアセンブラにする。
2.1で更にSSE命令を利用して、浮動小数点の演算を一気に行う。
3.シェーダーを使う(CPUでは無くグラフィックボードに演算させる)
等がベクトル演算を高速化させる手段として有効です。
>むかーしどこかのサイトで、
>無駄な部分を処理せずに(例えば必ず0の要素の個所は、最初から演算させない
昔(コプロセッサが別だった頃)は浮動小数点の計算が遅かったため、そういうアルゴリズムも組めたかもしれませんが
現在のCPU(Pentium4等)のfloatの演算に関していえば、整数の演算とほぼ同じ速度です。
その為0かどうかを毎回チェックするぐらいなら、そのまま演算させた方が高速なのです。
(ちなみにdoubleの演算は遅い為、高速化を望むなら避けた方が良いでしょう。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 全微分のdx,dyの意味 3 2023/05/26 08:13
- 数学 【全微分について】 z=f(x,y) の全微分は df=(∂f/∂x)dx+(∂f/∂y)dy と表 1 2023/02/25 05:49
- その他(IT・Webサービス) 高速処理可能な表計算ソフトについて ExcelやGoogleスプレッドシートのような表計算ソフトで、 2 2023/04/29 16:06
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
生年月日(yyyy/MM/dd) → 年齢...
-
行列の積の処理を高速化したい
-
画像の2値化について
-
String^の^自体が何を意味して...
-
Windows Media Playerを開くと...
-
麻雀ソフトのソースコード
-
【C言語】行列のランク(階数)...
-
Dreamweaverのライブラリが反映...
-
outp関数について
-
マウスのクリックを自動で
-
3次元データを3D表示
-
三目並べを作っているのですがD...
-
設定ファイルを扱うライブラリ...
-
VB.NET とドットNET(.NET...
-
Qtを勉強するのに何か良い書籍...
-
iCloudフォトライブラリ内の画...
-
MSP430のプログラム学習
-
Excel2003 VBE 参照設定を解除...
-
オブジェクトブラウザの「stdol...
-
システムコールと標準ライブラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
生年月日(yyyy/MM/dd) → 年齢...
-
C++/CLIで画像処理
-
色混ぜのアルゴリズム
-
直線と線分の交差判定について...
-
解像度と誤差について
-
ノイズ処理の原理
-
画像をFFTした際のスペクトル分...
-
OpenCVで寸法測定
-
姿勢センサでプロジェクタの台...
-
アフィン変換後の画像に線が入...
-
行列の積の処理を高速化したい
-
リアルタイムで多数の3角形ポリ...
-
魚眼画像について
-
2枚の画像間の色ヒストグラム距...
-
OpenCVで、画像の平均階調値よ...
-
画像の拡大
-
点字認識システムを作成したい...
-
自動で仮説を立てるような学習...
-
C言語の作成依頼です。
-
Canny法に用いる閾値の決定法に...
おすすめ情報