約 11,911 件
https://w.atwiki.jp/linearalgebra/pages/42.html
このページの内容は書きかけです。 13-2転置行列の行列式
https://w.atwiki.jp/opengl/pages/102.html
単位行列が初期化なのは何故か?という事を説明するには行列の計算方法を 知らなければなりません。 行列も普通の計算と同じで和差積商(加減乗除)があります。 和は足し算、差は引き算、積はかけ算、商は割り算の事です。 行列と行列の和,差を行うには、行列の型が同じでなければなりません。 つまり、行列Aと行列Bの和(または差)を行う場合、互いの行数と列数が 等しくなければできません。 例えば以下のようになります。 続いて、行列の積ですが、まず、行列の実数倍という物があり、 そして、行列と行列の積は左行列の列数と右行列の行数が 同じでなければできません。 さらに、m行 p列の行列 と p行 n列の行列の積は m行 n列の行列となります。 具体的な計算の例を以下に示します。 行列の商というのはないそうです。(逆行列のような特殊なケースの場合のみ存在する?) では単位行列の積を行うと、どういった事が起こるのか見てみます。 どうでしょう?左行列がそのまま解になっていますね。 つまり掛け算で 1 を掛けるのと同じです。 OpenGL では glMatrixMode(GL_PROJECTION); と glMatrixMode(GL_MODELVIEW); で 行列を切り替えますが それらを単位行列にもどしてやらないと、ずっと最終的な行列の値に 行列を掛け合わせる事になります。 では、次回、glLoadIdentity(); を置き換えてみます。
https://w.atwiki.jp/opengl/pages/129.html
行列の合成です。 glMultMatrixf(); がしている事です。 これは単純に行列の積を行っているだけです。 行列 平行移動行列 のプログラムの glMultMatrixf(); を使わずに glLoadMatrixf(); で設定するように変えてみましょう。 全く同じ結果になる事がわかると思います。 ただし、行列は掛け合わせる順番が変わると全く違う物になります。 何やら回りくどい事をしているように感じるかもしれませんが、 それは今回のプログラムでは合成回数が1回だからです。 『スキンメッシュアニメーション』等、行列の合成を何回も何回も しなければならない場合に効率を上げるには glMultMatrixf(); を 使わずに手動で行列の合成をしなければなりません。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //緑 GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 }; //単位行列 GLfloat mat[]={ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 }; //平行移動用 GLfloat move[]={ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 }; GLfloat modelview[16]; GLfloat multi[16]; //合成 glMultMatrixfの代わり void multiplication(GLfloat* src1,GLfloat* src2,GLfloat* dst) { for(int y=0;y 4;y++){ for(int x=0;x 4;x++){ dst[y*4+x]=src2[y*4]*src1[x]+src2[y*4+1]*src1[x+4]+src2[y*4+2]*src1[x+8]+src2[y*4+3]*src1[x+12]; } } } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, WIDTH, HEIGHT); glMatrixMode(GL_PROJECTION); //glLoadIdentity();と同じ↓ glLoadMatrixf(mat); //視野角,アスペクト比(ウィンドウの幅/高さ),描画する範囲(最も近い距離,最も遠い距離) gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0); glMatrixMode(GL_MODELVIEW); //glLoadIdentity();と同じ↓ glLoadMatrixf(mat); //視点の設定 gluLookAt(150.0,100.0,-200.0, //カメラの座標 0.0,0.0,0.0, // 注視点の座標 0.0,1.0,0.0); // 画面の上方向を指すベクトル //ライトの設定 glLightfv(GL_LIGHT0, GL_POSITION, lightpos); //マテリアルの設定 glMaterialfv(GL_FRONT, GL_DIFFUSE, green); //平行移動 //glTranslatef(x,0.0f,0.0f);と同じ↓ move[12]=x; //X軸の平行移動成分を設定 //glMultMatrixf(move);と同じ↓ glGetFloatv(GL_MODELVIEW_MATRIX,modelview); multiplication(modelview,move,multi); glLoadMatrixf(multi); glutSolidSphere(40.0,16,16); glutSwapBuffers(); } void idle(void) { if(flag){x-=1.0f;}else{x+=1.0f;} if(x 50.0f)flag=true; if(x -50.0f)flag=false; Sleep(1); glutPostRedisplay(); } void Init(){ glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( 平行移動行列を合成 ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/opengl/pages/103.html
では、glLoadIdentity(); を glLoadMatrixf(mat); で単位行列を設定するように 置き換えてみます。 チュートリアル 固定機能編 の 球を表示して移動する のプログラムを書き換えてみました。 全く同じに動作しています。 単位行列は GLfloat mat[]={ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 }; という感じで16個の要素を持った変数に格納します。 #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #define WIDTH 320 #define HEIGHT 240 //平行移動用 float x = 0.0f; bool flag = false; //緑 GLfloat green[] = { 0.0, 1.0, 0.0, 1.0 }; //ライトの位置 GLfloat lightpos[] = { 200.0, 150.0, -500.0, 1.0 }; //単位行列 GLfloat mat[]={ 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 }; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, WIDTH, HEIGHT); glMatrixMode(GL_PROJECTION); //glLoadIdentity();と同じ↓ glLoadMatrixf(mat); //視野角,アスペクト比(ウィンドウの幅/高さ),描画する範囲(最も近い距離,最も遠い距離) gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0); glMatrixMode(GL_MODELVIEW); //glLoadIdentity();と同じ↓ glLoadMatrixf(mat); //視点の設定 gluLookAt(150.0,100.0,-200.0, //カメラの座標 0.0,0.0,0.0, // 注視点の座標 0.0,1.0,0.0); // 画面の上方向を指すベクトル //ライトの設定 glLightfv(GL_LIGHT0, GL_POSITION, lightpos); //マテリアルの設定 glMaterialfv(GL_FRONT, GL_DIFFUSE, green); //平行移動 glTranslatef(x,0.0f,0.0f); glutSolidSphere(40.0,16,16); glutSwapBuffers(); } void idle(void) { if(flag){x-=1.0f;}else{x+=1.0f;} if(x 50.0f)flag=true; if(x -50.0f)flag=false; Sleep(1); glutPostRedisplay(); } void Init(){ glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( 単位行列 ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; } ですが、何故、初期化なのかはまだ解らないですね。 これから解説する平行移動行列と回転行列、拡大縮小行列が解ると 単位行列の意味が解ると思います。 それでは次回、平行移動行列を解説します。
https://w.atwiki.jp/nopu/pages/199.html
代数構造 下(上)三角行列は通常の和と積で非可換環(多元環, 代数)をなす。 (i) (ii) Rem. 積は非可換だが,対角成分のみに着目すれば可換であり, しかもそれは対角同士の積である。 Ex. 固有値 Th. 三角行列の固有値は,その対角成分である。 の固有値は 1, 4, 6 Schur分解 任意の正方行列は、ユニタリ相似変換によって上三角行列にすることができる。 特に,対角成分は固有値である。 i.e. 任意の正方行列は (i) 三角化可能で、しかも (ii) 元の行列とユニタリ相似である。 そして、三角行列の固有値はその対角成分であるから、 (iii) 元の行列の固有値は三角化さえすれば求められる。
https://w.atwiki.jp/linearalgebra/pages/81.html
6-1単位行列 6-2正則行列・逆行列 6-3対角行列・スカラー行列 6-4トレース(固有和) 6-5べき
https://w.atwiki.jp/nopu/pages/233.html
Normal matrix 対称行列とエルミート行列および直交行列とユニタリ行列も参照 Def. 正規行列 が正規行列であるとは,AとA*が可換 となることをいう。 Ex. ユニタリ行列、直交行列 エルミート行列、対称行列 歪エルミート行列,歪対称行列(交代行列)など。 Th. Toeplitz 正規行列はユニタリ相似変換によって対角化可能である。 i.e. 逆に、対角行列をユニタリ相似変換したものは正規行列である。 Rem. 実は,単位固有ベクトルを並べたものがUの正体であって, という書き方は以下で述べるスペクトル分解と等価である。 従って,を以てスペクトル分解と宣う本もある。 Th. 正規行列の相異なる固有値に対する固有空間は互いに直交する。 さらに,相異なる固有値に対する固有空間の全体は,元の空間の直和分解を与える。 Cor. スペクトル分解 正規行列Aに対して,スペクトル分解が存在する。 固有空間への正射影 1-i. ←射影が「単位の分解」を為す。という。 1-ii. 2. Cor. 行列のべき
https://w.atwiki.jp/linearalgebra/pages/82.html
このページの内容は書きかけです。 6-1単位行列 6-1-1 正方行列、単位行列 6-1-2 単位行列の性質
https://w.atwiki.jp/nopu/pages/203.html
環にはならない(零元を持たないため,和に関して群をなさない)ことに注意! 正則行列の特徴付け 一般線形群GLの元 線形同型 Def. 逆行列を持つ正方行列 Th. 正方行列Aが左(右)逆行列Xを持てば,Xは右(左)逆行列である。 Th. 実正方行列Aに対して,以下は同値 1. 正則である。 2. 行列式が非零 3. Rank A = n (full rank, 非退化) 4. Ker A = {0} (faithful) 5. Aがbijection 6. 各列(行)ベクトルが線形独立 7. 固有値が非零 8. 非霊ベクトルの像は非霊 Rem. 以上の条件は,整数値行列では必ずしも同値でないことに注意する。 つまり,逆行列の成分として有理数をとらなければならない場合には, 整数行列の範囲では逆行列を持たない,つまり正則でないということになる。 正則行列の作り方 1. 単位行列にべき零行列を足したもの 実際,
https://w.atwiki.jp/linearalgebra/pages/45.html
このページの内容は書きかけです。 13-5行列の積と行列式 13-5-1行列の積と行列式 13-5-2ユニタリ行列(直交行列)の行列式