C语言关于矩阵的一些运算(转置,求逆,乘法)
1.矩阵的转置 Transpose(例子,以3*4的矩阵为例,其他修改数字即可)
void Transpose(int Mat[3][4], int newMat[4][3])//Mat是要进行转置的,newMat是转置后的
{
for (int i = 0; i < 4; i++)//循环写入newMat
{
for (int j = 0; j < 3; j++)
{
newMat[j][i] = Mat[i][j];//置换
}
}
}
//测试
int main()
{
int Mat[3][4]={1,2,3,4,7,8,9,4,5,6,3,4};
int newMat[4][3];
Transpose(Mat, newMat);
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
printf("%d,",newMat[i][j]);
printf("\n");
return 0;
}
2.矩阵的逆 (高斯消元法,效率高)
#define N 3
void Gauss(int A[][N], float B[][N], int n)//这里的n指的是n*n的方阵中的n
{
int i, j, k;
float max, temp;
float t[N][N]; //临时矩阵
//将A矩阵存放在临时矩阵t[n][n]中
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
t[i][j] = A[i][j];
}
}
//初始化B矩阵为单位阵
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
B[i][j] = (i == j) ? (float)1 : 0;
}
}
for (i = 0; i < n; i++)
{
//寻找主元
max = t[i][i];
k = i;
for (j = i + 1; j < n; j++)
{
if (fabs(t[j][i]) > fabs(max))
{
max = t[j][i];
k = j;
}
}
//如果主元所在行不是第i行,进行行交换
if (k != i)
{
for (j = 0; j < n; j++)
{
temp = t[i][j];
t[i][j] = t[k][j];
t[k][j] = temp;
//B伴随交换
temp = B[i][j];
B[i][j] = B[k][j];
B[k][j] = temp;
}
}
//判断主元是否为0, 若是, 则矩阵A不是满秩矩阵,不存在逆矩阵
if (t[i][i] == 0)
{
printf("There is no inverse matrix!");
system("pause");
exit(0);
}
//消去A的第i列除去i行以外的各行元素
temp = t[i][i];
for (j = 0; j < n; j++)
{
t[i][j] = t[i][j] / temp; //主对角线上的元素变为1
B[i][j] = B[i][j] / temp; //伴随计算
}
for (j = 0; j < n; j++) //第0行->第n行
{
if (j != i) //不是第i行
{
temp = t[j][i];
for (k = 0; k < n; k++) //第j行元素 - i行元素*j列i行元素
{
t[j][k] = t[j][k] - t[i][k] * temp;
B[j][k] = B[j][k] - B[i][k] * temp;
}
}
}
}
}
//测试
int main()
{
int Mat[3][3]={1,2,3,4,7,8,9,4,5};
int newMat[3][3];
Gauss(Mat,newMat,3);//3*3矩阵
/***输出函数****/
return 0;
}
3.矩阵乘法
void Multy(int A[3][4],int B[4][3],int result[3][3] )//计算A*B
{//没有做AB行列不等情况的判断
for (int i = 0; i <3; i++)
{//取A的每一行,共3行,因此i<3
for (int j = 0; j < 3; j++)
{//取B的每一列,共3列,因此j<3
int sum = 0;
for (int k = 0; k < 4; k++)
{//对A行的所有列,B列的所有行。因此K=4
sum += A[i][k] * B[k][j];//计算行列乘积之和
}
result[i][j] = sum;//计算A的第i行与B的第j列乘积之和,作为result的ij元素
}
}
}
int main()
{
int result[3][3] ;//结果矩阵
int A[3][4]={.....};
int B[4][3]={.....};
Multy(A,B,result);
/****输出result********/
return 0;
}