C++による数学プログラムスレ

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
マ板か数学板か迷ったら、こちらでどうぞ。

主に
・解法のプログラム化
・計算ルーチンの最適化
・各種計算の近似方法
・各種数学ライブラリー
などで盛り上がるとうれしいです。
なんで全角?
ねえ、なんで全角?
サブジェクトに++が使えない
5デフォルトの名無しさん:02/09/12 11:34
多倍長演算のできるテンプレートライブラリで
一番速いのはどれ?
6デフォルトの名無しさん:02/09/12 11:34
>>3
プログラムスレ
7じゅじゅ:02/09/12 11:36
プログラムってやってなんの意味があんの?
8デフォルトの名無しさん:02/09/12 11:37
数値計算のレシピ in C ホーム
http://www.nr.com/

アウェー C++
http://www.nr.com/cpp-blurb.html
9デフォルトの名無しさん:02/09/12 11:37
VC++6で使うつもりなんですけど、行列ライブラリーの
Blitz++
TNT
を検討してます。
用途は、3Dソフトもどきの開発です。
どちらが計算精度や速度、機能的に優れているのでしょうか?
他にもあれば教えて欲しいです。
>>4
C++ 相談室のは「++」は何なのでしょう?
111:02/09/12 11:41
>>8
その本って、日本語版も出てましたよね?
付いてくるライブラリがバグってるらしいから
買わなかったけど、上のアドレスで修正版が手に入るなら
買ってみようかな・・・。


12デフォルトの名無しさん:02/09/12 11:42
Intel Math Kernel Library (Intel MKL) for Windows
http://www.nag-j.co.jp/IntelProducts/winMKL.htm
で決まり。
ただの受け売りだけど(汗)
関連スレ

プログラミングの為の数学と算数
http://pc3.2ch.net/test/read.cgi/tech/997150743/
★数学を禿げしく理解するスレinプログラム板★
http://pc3.2ch.net/test/read.cgi/tech/1029077872/
14デフォルトの名無しさん:02/09/12 13:16
よし
パパ倍制度でやっちゃうぞ〜




で、どうやんの?
15デフォルトの名無しさん:02/09/12 13:54
>>14

とりあえず、「64ビット符号なし整数の加算・乗算を32/16/8
ビット整数型変数を用いて行う」あたりからやってみよう。
これは「手で行う筆算」と同様にすればすぐできるから、次
に減算と除算、そして符号の処理を入れてみる。

あとは、同様の方法でいくらでも桁数を上げられるね。
3Dとかに使うので中身はアセソブラソで実装しときまひょ(゚ ∀ ゚)
17デフォルトの名無しさん:02/09/12 17:59
だれか、4x4固定でアセンブラ化されててもいいんで
最速の行列計算関数うpして!
http://www.amazon.com/exec/obidos/tg/detail/-/0387941150/
これって読んだ人います?
>16

なんでアセンブラ化するの?
処理をグラフィックカードとかに委譲しやすく実装するのが常識でしょう?
アセンブラ化した方が、グラフィックカードに処理を渡しやすくなるの?
20デフォルトの名無しさん:02/10/07 13:38
>>19
C++ではレジスタを参照できないからだよ。低脳
>>20
ずいぶん昔の書き込みにレスするもんだ。
22デフォルトの名無しさん:02/10/07 23:31
どのように計算すれば、Matrixの大小比較を行えますか?

4x4のマトリックスを格納できるクラス、CMatrixに
<,>,<=,>=オペレータを定義したいのです。
23デフォルトの名無しさん:02/10/08 00:09
>>22
大小の基準はなんだ?
24デフォルトの名無しさん:02/10/08 00:19
valarrayマンセー
>>24
そう言われてみれば、C++にはvalarrayあったっけ。
でもどのスレでもvalarrayについて書かれたレスなかったような。
この際ですから議論しましょう。
26デフォルトの名無しさん:02/10/08 10:11
>>24
>>25
valarrayってなんだYO!
27デフォルトの名無しさん:02/10/08 10:20
数値計算ライブラリにお詳しい方に質問です。

Windows上で任意精度整数(無限精度整数)を扱うライブラリって何が良いのでしょうか?
ネットで調べたところ、UNIX上で動くライブラリばかりでWin32環境で作動するライブラリがありません。
唯一NTLというライブラリが見つかったのですが、
任意精度整数だけでなくたくさんの機能があるためLIBのサイズが8MBもあります。

唐突な質問で申し訳ございませんが、ご存知の方いらっしゃいましたらよろしくお願いします。

NTLのサイト
http://www.shoup.net/
28デフォルトの名無しさん:02/10/08 10:21
>>26
STLの配列だYO!
基本的にvectorより早いから、使えるときには使おう。
29デフォルトの名無しさん:02/10/08 10:26
>>27
上にもあるけど、小さいのがいいなら自分で作ったほうがいいかも。
四則演算程度ならスグできるだろうし、あとは必要に応じて
演算子を追加していけばOKだと思う。

俺も中学のときにBASICで無限精度の計算ルーチン作ったから、
落ち着いてやればきっとできると思う。

もしくはNTLを解読して、必要な部分だけ引っ張ってくるとか。
ソースは見てないけど、インライン展開が多いからLIBが大きいんじゃないかな?
多倍長でアセンブラ使いたくないないなら 100進とか千進で書くと楽だよ
んじゃ、お題決定。
多倍長整数クラス誰か作って。
んじゃ下以下の人、よろしく。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
3227:02/10/08 10:44
>>29
>>30
なるほど。やはり自作した方がよさそうですね。
確かに後々のことを考えればそうするべきなんでしょうね。
ダメな私なりにがんばります。
ありがとうございました。
3322:02/10/08 10:57
>>23
基準ですか。。。3x3なら、3つのベクトルの大きさを利用して
求めるのが手だと思ったのですが、4x4はさっぱり分かりません。

ようは、STLで使えるようにしたかったんです。
さすがにマトリックスをmapのキーとして使うような状況は想像できませんが
念のため、マトリックスクラスにオペレーター定義をしておきたいのです。
正方行列なら 行列式でも求めて、それで比較しますか? 意味ないけど
3522:02/10/08 11:26
>>34
それはやってみましたが、行列式の性質とか実はよく知りません。
異なるMatrixが同じ行列式を持つことはあるのでしょうか?
>>35 そりゃ当然あるでしょ 
3735:02/10/08 11:58
>>36
やっぱりそうかー。

16個の値を元にハッシュして出来た値を基準にして比較すれば
できそうだけど、数学的なマトリックスの大小関係では無いんですよね。
#そもそも、マトリックスに大小関係があるかどうかも知りません。

まぁSTLで使うだけなら「異なるマトリックスが同じ基準値をとることがない」
ってことだけクリアーできればOKだから、ハッシュでやってみるかな。
ハッシュテーブルのサイズがどれくらいになるか見当もつかないけど。
38デフォルトの名無しさん:02/10/08 12:26
鬱だ氏のう..
>>37 なんかもう電波一歩手前・・・大丈夫か?
40デフォルトの名無しさん:02/10/08 15:53
幾つかの変換が適用されたマトリックスを移動、回転、縮小に分解したいのですが
どういった方法がありますか?
41店長:02/10/08 16:01
R^4 と R の間の全単射写像を作って、R から順序を誘導すればいいと思われ。

例: R^2 と R の場合
a=0.1415926...
b=0.4142135...
f(a,b)=0.14411452912365...

で写像を作れば R^2 を全順序付けることは可能
http://www.google.com/search?num=100&hl=ja&ie=Shift_JIS&q=%8F%87%8F%98%8FW%8D%87+%91S%8F%87%8F%98+%94%BC%8F%87%8F%98&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
42デフォルトの名無しさん:02/10/08 16:08
上野は何?
4337:02/10/08 16:37
>>39
気遣いありがとう。
終盤になってコロコロと平気で話を変えるヘボSEのせいでマジで死にそう。
今月で終わればいいが。。。
>>40 移動の表現ってどうやってるの?
4540:02/10/08 17:18
>>44
移動は

|1 0 0 0|
|0 1 0 0|
|0 0 1 0|
|x y z 1|

こんな感じです。
46デフォルトの名無しさん:02/10/08 23:52
倍精度でやるには素数は必要ですか?
47デフォルトの名無しさん:02/10/09 07:54
>>44
平行移動をパラメータとして扱うためには3x3じゃなくて
普通は4x4行列を使います。
詳しくは「宇治杜中」ってサイトでどうぞ。3D野郎は既知だろうけど。
48デフォルトの名無しさん:02/10/09 07:56
>>46
特に意識する必要はないと思うけど・・・。
どんなルーチンを考えていますか?
49デフォルトの名無しさん:02/10/09 07:57
>>41

>>40
へのレスなの?それともスレ違い??

高度すぎてよくわからないけど。
50デフォルトの名無しさん:02/10/09 08:05
>>49

>>41>>22へのレスでせう
5122:02/10/11 08:11
>>41
うーんと、わたしもよく分からないんですが(^^;
これは線形代数とかの分野になるんでしょうか?
明日にでも大きい本屋に行って買ってきます。
>>45
じゃ純粋な回転は?
5340:02/10/11 09:16
>>45

回転順がXYZだとすれば、Rが回転Matrixです。
3x3と一緒です。

R = Rx * Ry * Rz

| 1 0 0 0 | = Rx
| 0 cx sx 0 |
| 0 -sx cx 0 |
| 0 0 0 1 |

| cy 0 -sy 0 | = Ry
| 0 1 0 0 |
| sy 0 cy 0 |
| 0 0 0 1 |

| cz sz 0 0 | = Rz
| -sz cz 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |

sx = sin(RotateX), sy = sin(RotateY), sz = sin(RotateZ)
cx = cos(RotateX), cy = cos(RotateY), cz = cos(RotateZ)
| x 0 0 0 | = G(x,y,z)
| 0 y 0 0 |
| 0 0 z 0 |
| 0 0 0 1 |

H =G(x,y,z)* Rx(φ1)*Ry(φ1)*Rz(φ1)*MOVE(x,y,z)

と分解したいって事だね?
5540:02/10/11 10:18
欲を言えば、scaleの中心点とpivotの中心点も扱いたいです。

Scale * Shear * Rotate * Translate
とやるのが普通だと思うのですが、

Scale = ScalePivot * Scale
Rotate = RotatePivot * Rotate
を前処理でやらせる感じでしょうか。

※ScalePivotとRotatePivotの行列は、Translateと同じ形です。
5640:02/10/11 10:20
あー、pivotを掛けるときに逆行列にしないといけないかもしれません。
まずMOVE(x,y,z)のx,y,z を求める。

次に回転行列を 任意ベクトルに積しても大きさは変化しない
|a0,b0,c0| ---> (a0^2+b0^2+c0^2)=1
|a1,b1,c1| ---> (a1^2+b1^2+c1^2)=1
|a2,b2,c2| ---> (a2^2+b2^2+c2^2)=1
もし変化したなら、その変化分は伸張によるとすれば求まるのでは?
5840:02/10/11 12:48
>>57
>任意ベクトルに積しても大きさは変化しない
これ知りませんでした。(もしくは完全に忘れたか)

TranslateとScaleは取得できました。
RotateをRotateX,RotateY,RotateZに分解するには
どうすればいいでしょうか?
59デフォルトの名無しさん:02/10/11 14:08
>>41
それだとa+biとa-biの大小はどうなるの?
>>58
その順に分解したいなら
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/999294620_53/IMG0002.JPG
でも必ず分解出来るかどうかは判らない
6140:02/10/17 22:39
>>60
「でも必ず分解出来るかどうかは判らない」ってのは
ちょっと嫌だな・・・。
たとえばどういう場合に分解できなくなります?
62デフォルトの名無しさん:02/10/22 13:06
行列って、可逆だと思ってたけど違うんだねー。
63デフォルトの名無しさん:02/10/22 16:17
>>15
実効性のあるFFT導入くらいはやらないとお勉強以上の意味はない。
行列は可逆じゃないでしょ たとえば行ベクトルと列ベクトルの積を考えれば
正方行列なら 行列式でも求めて、それで比較しますか? 意味ないけど
66デフォルトの名無しさん:02/10/27 02:23
#include <stdio.h>
#include <float.h>
#include <stdio.h>

unsigned int_controlfp(unsigned int,unsigned int);

#define UP _controlfp(_RC_UP,_MCW_RC)
#define DOWN _controlfp(_RC_DOWN,_MCW_RC)
#define NEAE _controlfp(_RC_NEAR,_MCW_RC3)

class Interval
{
double min,max;
public:
Interval(double a= 0);
Interval(double a,double b);
void Print(void);
friend Interval operator+(const Interval &x, const Interval &y);
friend Interval operator-(const Interval &x, const Interval &y);
friend Interval operator*(const Interval &x, const Interval &y);
friend Interval operator/(const Interval &x, const Interval &y);
};
67デフォルトの名無しさん:02/10/27 02:25
↑のプログラムのunsigned int_controlfp(unsigned int,unsigned int);
とfriend Interval operator+(const Interval &x, const Interval &y);
の意味がわからない 教えてください
68デフォルトの名無しさん:02/10/27 02:30
unsigned int_controlfp(unsigned int,unsigned int);

#define UP _controlfp(_RC_UP,_MCW_RC)
#define DOWN _controlfp(_RC_DOWN,_MCW_RC)
#define NEAE _controlfp(_RC_NEAR,_MCW_RC3)

で、0捨1入、上、下への丸めの指定でした。
すいません。
69デフォルトの名無しさん:02/10/27 13:52
C++で幾何数学を勉強したいのですが…
C++は微分可能ですか?
71デフォルトの名無しさん:02/10/28 03:00
A
>>66
#include <cfloat>
#include <cstdio>
3Dとかに使うので中身はアセソブラソで実装しときまひょ(゜ ∀ ゜)
あー、pivotを掛けるときに逆行列にしないといけないかもしれません。
75デフォルトの名無しさん:02/11/29 16:09
C++は C^2 級ということですか?
76 :02/11/29 20:13
>>70 その発想ワロタ

C++はどう見ても連続じゃなさそう
そうなると自明に微分不能に・・・
77デフォルトの名無しさん:02/12/01 02:07
valarray は?
SSE2で微分可能になる。
(だろうか?)
79デフォルトの名無しさん:02/12/01 02:53
∂C++/∂SSE2=
80デフォルトの名無しさん:02/12/01 09:12
すこしは線形代数勉強しろ!!
matlabは?
82中卒:02/12/01 13:07
(´Д⊂ヽ何言ってるかわかんないよ〜
微分云々なら解析学じゃないのか
84デフォルトの名無しさん:02/12/01 13:59
C++でフーリエ級数は使えますか?
85デフォルトの名無しさん:02/12/01 15:20
     ト、
.     | `ヽ、  ,..l-―''Z-‐''Z._,.-(  ___,
 .   ト、|  ヽ`く ト、 ´    ′ `´ ∠_.ィ
     | |   l ヽl `i         ´  ム_.ィ
    l. |    l  l i |::.............._        {    C++の野郎は気にくわねぇ!
  '、ー-ゝ、l.  |i l l| l |l:::::::::::::::::`'ーz__     |
  ヽ.   ミ>‐ッ、|,ィ-‐ッへィ-‐''¨了:::::::ーz    ム   徹底的に反逆するぜ、
 、_ヽ、ミ/ /    / /,.--―、`'j::::::::ーz   了
  ヽ、 ̄7´, イニミ-、i l /-┘jニ..⌒` }:::::::<_   ノ  この「VisualAgeCOBOLのカズマ」がな!
   ヽ/∠_ミヽ/⌒〉 l/''¨ス  pゝ  `'j::iへ、Z  ぐ   ト、
    //  .`ー}`フ  l `'''  ̄'''"   jリ ヘ }Z /^    | lヽ
   /    .| \  __       r'フ /了/     | .|::|  
           l l ̄――v`i     「ーt'´::::/^     .} |::|
         ヽヽ ,.-‐-‐ー}    /|__,,..ルヘL__    ノ .|::|
          ヽ`、_,,,,,__ノ_,,. -‐'¨´ _,.,.,.,.,.,.,,ヽ  /  ノミl
        _,,..〉-‐'',ニ¨-―-、''"""      〈 /  /ミ/
    _,.-‐''¨ ,.-‐'¨フ´      `ヽ        ∨  /ミ/
   `'ー、  y′ /       ミへ.._       ヽ/ミ/
      `ーィ   ゝ,       ミく  人二ヽ     li/
86見るなー
>>83
微分トポロジーは?