最新版 |
編集中の文章 |
31行目: |
31行目: |
| inv[0][1] = -(a[0][1] * a[2][2] - a[0][2] * a[2][1]) * invdet; | | inv[0][1] = -(a[0][1] * a[2][2] - a[0][2] * a[2][1]) * invdet; |
| inv[0][2] = (a[0][1] * a[1][2] - a[0][2] * a[1][1]) * invdet; | | inv[0][2] = (a[0][1] * a[1][2] - a[0][2] * a[1][1]) * invdet; |
− |
| |
| inv[1][0] = -(a[1][0] * a[2][2] - a[1][2] * a[2][0]) * invdet; | | inv[1][0] = -(a[1][0] * a[2][2] - a[1][2] * a[2][0]) * invdet; |
| inv[1][1] = (a[0][0] * a[2][2] - a[0][2] * a[2][0]) * invdet; | | inv[1][1] = (a[0][0] * a[2][2] - a[0][2] * a[2][0]) * invdet; |
| inv[1][2] = -(a[0][0] * a[1][2] - a[1][0] * a[0][2]) * invdet; | | inv[1][2] = -(a[0][0] * a[1][2] - a[1][0] * a[0][2]) * invdet; |
− |
| |
| inv[2][0] = (a[1][0] * a[2][1] - a[2][0] * a[1][1]) * invdet; | | inv[2][0] = (a[1][0] * a[2][1] - a[2][0] * a[1][1]) * invdet; |
| inv[2][1] = -(a[0][0] * a[2][1] - a[2][0] * a[0][1]) * invdet; | | inv[2][1] = -(a[0][0] * a[2][1] - a[2][0] * a[0][1]) * invdet; |
| inv[2][2] = (a[0][0] * a[1][1] - a[1][0] * a[0][1]) * invdet; | | inv[2][2] = (a[0][0] * a[1][1] - a[1][0] * a[0][1]) * invdet; |
− |
| |
− | return true;
| |
− | }
| |
− | </source>
| |
− |
| |
− | == 4x4行列の場合 ==
| |
− |
| |
− | C言語風に実装すると以下のような感じ。
| |
− | <source lang="c">
| |
− | bool inverseMatrix(float a[4][4], float inv[4][4]) {
| |
− | float det = a[0][0] * (a[1][1] * (a[2][2] * a[3][3] - a[3][2] * a[2][3]) - a[2][1] * (a[1][2] * a[3][3] - a[3][2] * a[1][3]) + a[3][1] * (a[1][2] * a[2][3] - a[2][2] * a[1][3]))
| |
− | - a[0][1] * (a[1][0] * (a[2][2] * a[3][3] - a[3][2] * a[2][3]) - a[2][0] * (a[1][2] * a[3][3] - a[3][2] * a[1][3]) + a[3][0] * (a[1][2] * a[2][3] - a[2][2] * a[1][3]))
| |
− | + a[0][2] * (a[1][0] * (a[2][1] * a[3][3] - a[3][1] * a[2][3]) - a[2][0] * (a[1][1] * a[3][3] - a[3][1] * a[1][3]) + a[3][0] * (a[1][1] * a[2][3] - a[2][1] * a[1][3]))
| |
− | - a[0][3] * (a[1][0] * (a[2][1] * a[3][2] - a[3][1] * a[2][2]) - a[2][0] * (a[1][1] * a[3][2] - a[3][1] * a[1][2]) + a[3][0] * (a[1][1] * a[2][2] - a[2][1] * a[1][2]));
| |
− |
| |
− | if (det == 0) {
| |
− | printf("The matrix is singular and cannot be inverted.\n");
| |
− | return false;
| |
− | }
| |
− |
| |
− | float invdet = 1 / det;
| |
− |
| |
− | inv[0][0] = ((a[1][1] * (a[2][2] * a[3][3] - a[3][2] * a[2][3]) - a[2][1] * (a[1][2] * a[3][3] - a[3][2] * a[1][3]) + a[3][1] * (a[1][2] * a[2][3] - a[2][2] * a[1][3])) * invdet;
| |
− | inv[0][1] = -((a[1][0] * (a[2][2] * a[3][3] - a[3][2] * a[2][3]) - a[2][0] * (a[1][2] * a[3][3] - a[3][2] * a[1][3]) + a[3][0] * (a[1][2] * a[2][3] - a[2][2] * a[1][3])) * invdet);
| |
− | inv[0][2] = ((a[1][0] * (a[2][1] * a[3][3] - a[3][1] * a[2][3]) - a[2][0] * (a[1][1] * a[3][3] - a[3][1] * a[1][3]) + a[3][0] * (a[1][1] * a[2][3] - a[2][1] * a[1][3])) * invdet;
| |
− | inv[0][3] = -((a[1][0] * (a[2][1] * a[3][2] - a[3][1] * a[2][2]) - a[2][0] * (a[1][1] * a[3][2] - a[3][1] * a[1][2]) + a[3][0] * (a[1][1] * a[2][2] - a[2][1] * a[1][2])) * invdet);
| |
− |
| |
− | inv[1][0] = -((a[0][1] * (a[2][2] * a[3][3] - a[3][2] * a[2][3]) - a[2][1] * (a[0][2] * a[3][3] - a[3][2] * a[0][3]) + a[3][1] * (a[0][2] * a[2][3] - a[2][2] * a[0][3])) * invdet);
| |
− | inv[1][1] = ((a[0][0] * (a[2][2] * a[3][3] - a[3][2] * a[2][3]) - a[2][0] * (a[0][2] * a[3][3] - a[3][2] * a[0][3]) + a[3][0] * (a[0][2] * a[2][3] - a[2][2] * a[0][3])) * invdet);
| |
− | inv[1][2] = -((a[0][0] * (a[2][1] * a[3][3] - a[3][1] * a[2][3]) - a[2][0] * (a[0][1] * a[3][3] - a[3][1] * a[0][3]) + a[3][0] * (a[0][1] * a[2][3] - a[2][1] * a[0][3])) * invdet);
| |
− | inv[1][3] = ((a[0][0] * (a[2][1] * a[3][2] - a[3][1] * a[2][2]) - a[2][0] * (a[0][1] * a[3][2] - a[3][1] * a[0][2]) + a[3][0] * (a[0][1] * a[2][2] - a[2][1] * a[0][2])) * invdet);
| |
− |
| |
− | inv[2][0] = ((a[0][1] * (a[1][2] * a[3][3] - a[3][2] * a[1][3]) - a[1][1] * (a[0][2] * a[3][3] - a[3][2] * a[0][3]) + a[3][1] * (a[0][2] * a[1][3] - a[1][2] * a[0][3])) * invdet);
| |
− | inv[2][1] = -((a[0][0] * (a[1][2] * a[3][3] - a[3][2] * a[1][3]) - a[1][0] * (a[0][2] * a[3][3] - a[3][2] * a[0][3]) + a[3][0] * (a[0][2] * a[1][3] - a[1][2] * a[0][3])) * invdet);
| |
− | inv[2][2] = ((a[0][0] * (a[1][1] * a[3][3] - a[3][1] * a[1][3]) - a[1][0] * (a[0][1] * a[3][3] - a[3][1] * a[0][3]) + a[3][0] * (a[0][1] * a[1][3] - a[1][1] * a[0][3])) * invdet);
| |
− | inv[2][3] = -((a[0][0] * (a[1][1] * a[3][2] - a[3][1] * a[1][2]) - a[1][0] * (a[0][1] * a[3][2] - a[3][1] * a[0][2]) + a[3][0] * (a[0][1] * a[1][2] - a[1][1] * a[0][2])) * invdet);
| |
− |
| |
− | inv[3][0] = -((a[0][1] * (a[1][2] * a[2][3] - a[2][2] * a[1][3]) - a[1][1] * (a[0][2] * a[2][3] - a[2][2] * a[0][3]) + a[2][1] * (a[0][2] * a[1][3] - a[1][2] * a[0][3])) * invdet);
| |
− | inv[3][1] = ((a[0][0] * (a[1][2] * a[2][3] - a[2][2] * a[1][3]) - a[1][0] * (a[0][2] * a[2][3] - a[2][2] * a[0][3]) + a[2][0] * (a[0][2] * a[1][3] - a[1][2] * a[0][3])) * invdet);
| |
− | inv[3][2] = -((a[0][0] * (a[1][1] * a[2][3] - a[2][1] * a[1][3]) - a[1][0] * (a[0][1] * a[2][3] - a[2][1] * a[0][3]) + a[2][0] * (a[0][1] * a[1][3] - a[1][1] * a[0][3])) * invdet);
| |
− | inv[3][3] = ((a[0][0] * (a[1][1] * a[2][2] - a[2][1] * a[1][2]) - a[1][0] * (a[0][1] * a[2][2] - a[2][1] * a[0][2]) + a[2][0] * (a[0][1] * a[1][2] - a[1][1] * a[0][2])) * invdet);
| |
− |
| |
| return true; | | return true; |
| } | | } |