部分行列の抜き出し(C言語)
部分行列の抜き出し(C言語)
ある行列から、任意の部分行列を抜き出すような関数を作りたいのですが、わからないので手助けをお願いしたいです。
たとえば4行4列の行列Aがあった場合、その2行2列、2行3列、3行2列、3行3列目の
4つの(2行2列の)要素を抜き出すような関数です。
枠組みは出来ているので載せておきます。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct matrix{
double *data;
int size[2];
}MATRIX;
MATRIX create_matrix(int m,int l,int a); //行列の作成
void print_matrix(MATRIX A); //行列の表示
MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k); //任意の部分行列の抜き出し
int main(int argc,char **argv)
{
//構造体の初期化
MATRIX matrix_A={NULL,NULL,NULL};
MATRIX matrix_B={NULL,NULL,NULL};
MATRIX matrix_C={NULL,NULL,NULL};
int m=0; //行列の行
int l=0; //行列の列
int a=1; //要素
double det=0; //行列計算
//行列Aの作成
m=4;//行
l=4;//列
matrix_A = create_matrix( m, l, a);
//関数
matrix_C = submatrix(matrix_A,2,2,3,3);
//行列結果出力
printf("\n\tmatrix input");
print_matrix(matrix_A);
printf("\n\tmatrix output");
print_matrix(matrix_C);
//行列の開放
free(matrix_A.data); matrix_A.data=NULL;
free(matrix_C.data); matrix_C.data=NULL;
printf("終了!\n\n");
return 0;
}
MATRIX create_matrix(int m,int l,int a)
{
MATRIX matrix_A={NULL,NULL,NULL};
int i=0;
//サイズの確保 行;size[0] 列;size[1]
matrix_A.size[0]=m;
matrix_A.size[1]=l;
//メモリの確保
matrix_A.data=(double *)malloc(sizeof(double)*matrix_A.size[0]*matrix_A.size[1]);
if(matrix_A.data == NULL){
printf("メモリ確保失敗!![matrix_A]\n");
exit(1);
}
//行列Aの作成
for(i=0; i<((matrix_A.size[0])*(matrix_A.size[1])) ;i++){
*(matrix_A.data+i)=a+i;
}
return(matrix_A);
}
/*行列の表示*/
void print_matrix(MATRIX matrix_A)
{
int i=0;
int j; //行
int k; //列
printf("\n行列の表示\n");
//行列Aのプリント
for(j=0;j<matrix_A.size[0];j++){
for(k=0;k<matrix_A.size[1];k++){
printf("%f\t",*(matrix_A.data+k*matrix_A.size[0]+j));
}
printf("\n");
}
return;
}
MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k)
{
MATRIX matrix_C = {NULL,NULL,NULL};
int i,j;
//サイズの確保 行;size[0] 列;size[1]
matrix_C.size[0]=l-m+1;
matrix_C.size[1]=k-n+1;
//メモリの確保
matrix_C.data=(double *)malloc(sizeof(double)*matrix_C.size[0]*matrix_C.size[1]);
if(matrix_C.data == NULL){
printf("メモリ確保失敗!![matrix_C]\n");
exit(1);
}
//任意の部分行列の抜き出し
(ここがわかりません。)
}
よろしくお願いします。
お礼
回答ありがとうございます。