Harigami
ログイン
(  ◜ᴗ¯) タイトルなし
No License C
コピー
#define N 3
#define EPS 1.0e-8

/* 第26行で定義している余因子を求める関数を宣言し, calc_determinant関数でこの関数を使用できるようにする */
double calc_cofactor_determinant(int n, double matrix[][n], int row, int column);

/* n*n行列の行列式を余因子から求める */
double calc_determinant(int n, double matrix[][n]) {
	int i, j;
	if (n < 3) {
		return n == 2 ? matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] : 0;
	} else {
		double determinant = 0;
		for (i = 0; i < n; i++) {
			determinant += matrix[i][0] * calc_cofactor_determinant(n, matrix, i, 0);
		}
		return determinant;
	}
}

/* n*n行列matrixのrow, column成分の余因子を求める */
double calc_cofactor_determinant(int n, double matrix[][n], int row, int column) {
	int i, j, add_index_i = 0, add_index_j = 0;
	double cofactor[n - 1][n - 1];
	for (i = 0; i < n; i++) {
		if (i == row) { // column行の成分は無視する
			continue;
		}
		add_index_j = 0;
		for (j = 0; j < n; j++) {
			if (j == column) { // row列の成分は無視する
				continue;
			}
			cofactor[add_index_i][add_index_j] = matrix[i][j];
			add_index_j++;
		}
		add_index_i++;
	}
	return ((row + column) % 2 == 0 ? 1 : -1) * calc_determinant(n - 1, cofactor);
}

/* n*n行列matrixの逆行列inversedを求める */
int calc_inverse_matrix(double matrix[][N], double inversed[][N]) {
	int i, j;
	double determinant = calc_determinant(N, matrix); // matrixの行列式
	if (determinant == 0) { // 行列式が0であった場合はエラー処理
		printf("determinant is 0");
		return 0;
	}
	/* ji成分の余因子から逆行列のij成分を求める */
	for (i = 0; i < N; i++) {
		for (j = 0; j < N; j++) {
			inversed[i][j] = calc_cofactor_determinant(N, matrix, j, i) / determinant;
		}
	}
	return 1; // 逆行列が正常に作られたことを示す
}
#define N 3
#define EPS 1.0e-8

/* 第26行で定義している余因子を求める関数を宣言し, calc_determinant関数でこの関数を使用できるようにする */
double calc_cofactor_determinant(int n, double matrix[][n], int row, int column);

/* n*n行列の行列式を余因子から求める */
double calc_determinant(int n, double matrix[][n]) {
	int i, j;
	if (n < 3) {
		return n == 2 ? matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] : 0;
	} else {
		double determinant = 0;
		for (i = 0; i < n; i++) {
			determinant += matrix[i][0] * calc_cofactor_determinant(n, matrix, i, 0);
		}
		return determinant;
	}
}

/* n*n行列matrixのrow, column成分の余因子を求める */
double calc_cofactor_determinant(int n, double matrix[][n], int row, int column) {
	int i, j, add_index_i = 0, add_index_j = 0;
	double cofactor[n - 1][n - 1];
	for (i = 0; i < n; i++) {
		if (i == row) { // column行の成分は無視する
			continue;
		}
		add_index_j = 0;
		for (j = 0; j < n; j++) {
			if (j == column) { // row列の成分は無視する
				continue;
			}
			cofactor[add_index_i][add_index_j] = matrix[i][j];
			add_index_j++;
		}
		add_index_i++;
	}
	return ((row + column) % 2 == 0 ? 1 : -1) * calc_determinant(n - 1, cofactor);
}

/* n*n行列matrixの逆行列inversedを求める */
int calc_inverse_matrix(double matrix[][N], double inversed[][N]) {
	int i, j;
	double determinant = calc_determinant(N, matrix); // matrixの行列式
	if (determinant == 0) { // 行列式が0であった場合はエラー処理
		printf("determinant is 0");
		return 0;
	}
	/* ji成分の余因子から逆行列のij成分を求める */
	for (i = 0; i < N; i++) {
		for (j = 0; j < N; j++) {
			inversed[i][j] = calc_cofactor_determinant(N, matrix, j, i) / determinant;
		}
	}
	return 1; // 逆行列が正常に作られたことを示す
}
現在、コメントはありません。
最初のコメンターになりませんか?