差分

ナビゲーションに移動 検索に移動

逆行列

4,024 バイト追加, 2023年12月22日 (金) 05:10
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[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][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][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;
 
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;
}

案内メニュー