#1
by tui » 6年前
このプログラムはayの逆行列を求めたのちその逆行列とR₀の行列を掛け算してclt[4][2]を求めたいと考えていますがうまくいきません
アドバイスお願いします。
コード:
#include <stdlib.h>
#include<iostream>
#include<cmath>
void Inversematrix(double a[4][4]);
void matrixmultiplication(double x[4][2], double y[4][4], double xy[4][2]);
double inv_a[4][4];
int main(int argc, char **argv)
{
double t[4] = { 0.0,0.2,0.6,1.0 }, R₀[4][2] = { { 1,2 },{ 2,3 },{ 3,1 },{ 5,1 } };
double R₀ay[4][2],clt[4][2];
double ay[4][4] = { { pow((1 - t[0]), 3), 3 * pow((1 - t[0]), 2)*t[0], 3 * (1 - t[0])*pow(t[0], 2), pow(t[0], 3)},
{ pow((1 - t[1]), 3), 3 * pow((1 - t[1]), 2)*t[1], 3 * (1 - t[1])*pow(t[1], 2), pow(t[1], 3)},
{ pow((1 - t[2]), 3), 3 * pow((1 - t[2]), 2)*t[2], 3 * (1 - t[2])*pow(t[2], 2), pow(t[2], 3)},
{ pow((1 - t[3]), 3), 3 * pow((1 - t[3]), 2)*t[3], 3 * (1 - t[3])*pow(t[3], 2), pow(t[3], 3)}}; //入力用の配列(R₀のxの値を代入
Inversematrix(ay);
matrixmultiplication(R₀,ay,R₀ay);
return 0;
}
void Inversematrix(double a[4][4])
{
double inv_a[4][4],t[4],R₀[2][2]; //ここに逆行列が入る
double buf; //一時的なデータを蓄える
int i, j, k; //カウンタ
int n = 4;
//単位行列を作る
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
inv_a[i][j] = (i == j) ? 1.0 : 0.0;
}
}
//掃き出し法
for (i = 0; i < n; i++) {
buf = 1 / a[i][i];
for (j = 0; j < n; j++) {
a[i][j] *= buf;
inv_a[i][j] *= buf;
}
for (j = 0; j < n; j++) {
if (i != j) {
buf = a[j][i];
for (k = 0; k < n; k++) {
a[j][k] -= a[i][k] * buf;
inv_a[j][k] -= inv_a[i][k] * buf;
}
}
}
}
//逆行列を出力
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf(" %f", inv_a[i][j]);
}
printf("\n");
}
}
void matrixmultiplication(double x[4][2],double y[4][4], double xy[4][2])
{
int i, j, k;
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
xy[i][j] = 0;
for (k = 0; k < 4; k++) {
xy[i][j] += x[i][k] * y[k][j];
}
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
printf("%4d", xy[i][j]);
}
putchar('\n');
}
}
このプログラムはayの逆行列を求めたのちその逆行列とR₀の行列を掛け算してclt[4][2]を求めたいと考えていますがうまくいきません
アドバイスお願いします。
[code]
#include <stdlib.h>
#include<iostream>
#include<cmath>
void Inversematrix(double a[4][4]);
void matrixmultiplication(double x[4][2], double y[4][4], double xy[4][2]);
double inv_a[4][4];
int main(int argc, char **argv)
{
double t[4] = { 0.0,0.2,0.6,1.0 }, R₀[4][2] = { { 1,2 },{ 2,3 },{ 3,1 },{ 5,1 } };
double R₀ay[4][2],clt[4][2];
double ay[4][4] = { { pow((1 - t[0]), 3), 3 * pow((1 - t[0]), 2)*t[0], 3 * (1 - t[0])*pow(t[0], 2), pow(t[0], 3)},
{ pow((1 - t[1]), 3), 3 * pow((1 - t[1]), 2)*t[1], 3 * (1 - t[1])*pow(t[1], 2), pow(t[1], 3)},
{ pow((1 - t[2]), 3), 3 * pow((1 - t[2]), 2)*t[2], 3 * (1 - t[2])*pow(t[2], 2), pow(t[2], 3)},
{ pow((1 - t[3]), 3), 3 * pow((1 - t[3]), 2)*t[3], 3 * (1 - t[3])*pow(t[3], 2), pow(t[3], 3)}}; //入力用の配列(R₀のxの値を代入
Inversematrix(ay);
matrixmultiplication(R₀,ay,R₀ay);
return 0;
}
void Inversematrix(double a[4][4])
{
double inv_a[4][4],t[4],R₀[2][2]; //ここに逆行列が入る
double buf; //一時的なデータを蓄える
int i, j, k; //カウンタ
int n = 4;
//単位行列を作る
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
inv_a[i][j] = (i == j) ? 1.0 : 0.0;
}
}
//掃き出し法
for (i = 0; i < n; i++) {
buf = 1 / a[i][i];
for (j = 0; j < n; j++) {
a[i][j] *= buf;
inv_a[i][j] *= buf;
}
for (j = 0; j < n; j++) {
if (i != j) {
buf = a[j][i];
for (k = 0; k < n; k++) {
a[j][k] -= a[i][k] * buf;
inv_a[j][k] -= inv_a[i][k] * buf;
}
}
}
}
//逆行列を出力
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf(" %f", inv_a[i][j]);
}
printf("\n");
}
}
void matrixmultiplication(double x[4][2],double y[4][4], double xy[4][2])
{
int i, j, k;
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
xy[i][j] = 0;
for (k = 0; k < 4; k++) {
xy[i][j] += x[i][k] * y[k][j];
}
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++) {
printf("%4d", xy[i][j]);
}
putchar('\n');
}
}
[/code]