矩阵运算
描述
实现从键盘上读取一个数n,输入n*n的矩阵A,首先判断矩阵A是否为实对称矩阵(实对称矩阵:n阶矩阵A,其矩阵的元素都为实数,且矩阵A的转置等于其本身(aij=aji),(i,j为元素的脚标),则称A为实对称矩阵。)
如果是实对称矩阵则输出 YES,再换行输出矩阵A*A^T的结果(A^T为A的转置) 。
如果不是实对称矩阵则输出NO,再输出矩阵A+A^T的结果(A^T为A的转置)。
以上矩阵输出都以n行n列的格式输出,每个元素用空格隔开,在每行最后一个元素输出换行。
(1)矩阵加法公式:每行每列对应元素相加,Cij=Aij + Bij;
(2)矩阵乘法公式:Cij = Ai0×B0j+Ai1×B1j+……+Ain×Bnj;
输入
从键盘上输入一个数n后再输入n*n的矩阵A。
输出
判断矩阵A是否为实对称矩阵(实对称矩阵:n阶矩阵A,其矩阵的元素都为实数,且矩阵A的转置等于其本身(aij=aji),(i,j为元素的脚标),则称A为实对称矩阵。)
如果是实对称矩阵则输出 YES,再换行输出矩阵A*A^T的结果(A^T为A的转置) ,
如果不是实对称矩阵则输出NO,再换行输出矩阵A+A^T的结果(A^T为A的转置)。
以上矩阵输出都以n行n列的格式输出,每个元素用空格隔开,在每行最后一个元素输出换行。(最后一个元素后面没有空格)
供参考:
#include <stdio.h>
#define N 20
int is_symmetricmatrix(int a[][N], int Row,int Col)//判断一个N*N矩阵,是否是对称矩阵,是返回1,否返回0
{
int i, j, flag;
for (i = 0, flag = 1; i < Row; i++)
{
for (j = 0; j < i; j++)
{
if (a[i][j] != a[j][i])
{
flag = 0;
break;
}
}
if (j < i) break;
}
if (flag)
return 1;
else
return 0;
}
void getTransposeMatrix(int b[][N], int a[][N], int Row, int Col)//矩阵转置
{
int i, j;
for (i = 0; i < Row; i++)
for (j = 0; j < Col; j++)
b[j][i] = a[i][j];
}
void matrixMul(int a[][N], int b[][N], int c[][N], int Rowa, int Cola, int Colb)//矩阵相乘
{
int i, j, k;
for(i=0;i<Rowa;i++)
{
for (j = 0; j < Colb; j++)
{
for (k = 0; k < Cola; k++)
c[i][j] += a[i][k] * b[k][j];
}
}
}
void matrixAdd(int a[][N], int b[][N], int c[][N], int Rowa, int Cola)//矩阵相加
{
int i, j;
for (i = 0; i < Rowa; i++)
for (j = 0; j < Cola; j++)
c[i][j] = a[i][j] + b[i][j];
}
void printmatrix(int a[][N], int Row, int Col)
{
int i, j;
for (i = 0; i < Row; i++){
for (j = 0; j < Col; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
}
int main()
{
int a[N][N] = { 0 }, b[N][N] = { 0 }, c[N][N] = {0}, i, j, n = 3;
scanf("%d", &n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d", &a[i][j]);
if (is_symmetricmatrix(a, n, n))
{
printf("YES\n");
getTransposeMatrix(b, a, n, n);
matrixMul(a, b, c, n, n, n);
printmatrix(c, n, n);
}
else{
printf("NO\n");
getTransposeMatrix(b, a, n, n);
matrixAdd(a, b, c, n, n);
printmatrix(c, n, n);
}
return 0;
}