常见算法:c语言矩阵算法问题

矩阵:数学上,一个m×n矩阵乃一mn列的矩形阵列。矩阵由数组成,或更一般的,由某环中元素组成。

0.矩阵N*N相乘

#include<stdio.h>
int main(void)
{
        int i,j,k;
        double a[3][3],b[3][3],c[3][3];

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        printf("Enter the number in a[%d][%d]\n",i,j);
                        scanf("%lf",&a[i][j]);
                }
        }

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        printf("Enter the number in b[%d][%d]\n",i,j);
                        scanf("%lf",&b[i][j]);
                }
        }

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        c[i][j]=0;
                        for(k=0;k<3;k++){
                                c[i][j]=a[i][k]*b[k][j]+c[i][j];
                        }
                }
        }

        for(i=0;i<3;i++){
                for(j=0;j<3;j++){
                        printf("    %lf",c[i][j]);
                }
                printf("\n");
        }

        return 0;
}


1,求矩阵转置问题

/*
根据主函数,编写一下两个函数
1:求数组a[4][4]主对角线上元素的和 ----区分主对角线和次对角线的区别
2:实现对数组a[4][4]的矩阵转置处理
*/
#include<stdio.h>
void convert(int *p)     //数组转置
{
	int i,j,t;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			t=*(p+4*i+j);
			*(p+4*i+j)=*(p+4*j+i);
			*(p+4*j+i)=t;
		}
}

int total(int a[][4],int n)       //主对角线上元素的和
{
	int i,sum=0;
	for(i=0;i<4;++i)
		if(a[i][i]!=0)
			sum+=a[i][i];
	return sum;
}
int total1(int a[][4],int n)     //次对角线上元素之和
{
	int i,j,sum=0;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			if((i+j)==3) sum+=a[i][j];     //此时仅当i+j=n-1的时候才是次对角线上的点
		}
		return sum;
}

void main()
{
	static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
	int *p,i,sum,sum1;
	sum=total(a,4);
	sum1=total1(a,4);
	printf("主对角线之和:%d\n",sum);
	printf("次对角线之和:%d\n",sum1);
	p=*a;
	convert(p);
	printf("转置后的数组是:\n");
	for(i=0;i<4;++i)
		printf("%d %d %d %d \n",a[i][0],a[i][1],a[i][2],a[i][3]);

}

2,求矩阵中最大值的问题

/*
有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号
*/
#include<stdio.h>
void main()
{
	int a[3][4],i,j;
	int colum,row;
	printf("please input the array:\n");
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
			scanf("%d",a[i][j]);
	printf("\n");
	int max=a[0][0];    //设定最大值是第一个数
	for(i=0;i<3;i++)
		for(j=0;j<4;j++)
			if(a[i][j]>max)
			{
				max=a[i][j];
				colum=j;
				row=i;
			}
	printf("max=%d,colum=%d,row=%d",max,colum,row);


}

3,找出m*n矩阵的鞍点

#include<stdio.h>
#include<stdlib.h>
#define M 3
#define N 4
void main()
{
	int a[M][N],i,j,k;
	int max,t;
	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
			scanf("%d",&a[i][j]);
	for(i=0;i<M;i++)
	{
		max=0;                        //此时假设每一行的最大值是第一个数即a[i][0]
		for(j=i+1;j<N;j++)            //找出列中的最大值
		{
			if(a[i][j]>a[i][max])
				max=j;
		}
		for(t=1,k=0;k<M&&t;k++)      //判断是否在列中是不是最小值
		{
			if(a[k][max]<a[i][max])  //如果还存在数比a[k][max]的值还小,则置t=0,
				t=0;                 //t是一个标识,t=0  表示不存在,
		}
	}
	if(t) printf("yes,%d\n",a[i][max]);
	else  printf("no");
}
4,矩阵的周边之和问题

/*
编写函数实现计算任意N*4整型矩阵上的周边元素之和
假设输入的数值
1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16
*/
#include<stdio.h>
#define N 3
int fun(int a[][4],int n)
{
	int i,sum=0;
	for(i=0;i<4;i++)
		sum+=a[0][i]+a[n-1][i];   //第一行和最后一行的和,此时的i代表的是列数
	for(i=1;i<n-1;i++)
		sum+=a[i][0]+a[i][3];       //第一列的的第二行开始到 n-1行的     和最后一列的的第二行开始到 n-1行的,此时的i代表的是行数
	return sum;
}
void main()
{
	int i,j;
	int a[N][4];
	for(i=0;i<N;i++)
		for(j=0;j<4;j++)
			scanf("%d",&a[i][j]);
	int s=fun(a,N);
	printf("矩阵N*4周边的元素之和为:%d",s);
	printf("\n");
}

5.判断一个N*N的矩阵是否为对称矩阵,将原矩阵输出,判断结果输出

#include<stdio.h>   
#define N 10
void main()  
{  
    int a[N][N],i,j,k,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)  
       for(j=0;j<n;j++)
          scanf("%d",&a[i][j]);
    for(i=0;i<n;i++)  
    {
         for(j=i+1;j<n;j++)
          {
             if(a[i][j]==a[j][i])    k=1;
             else   k=0;
          }
   }
   if(k=0)    printf("bushi");
   else       printf("shi\n");
   for(i=0;i<n;i++)  
      for(j=0;j<n;j++)
         printf("%d",a[i][j]);
}
6,求一个4*3的矩阵各行元素的最大值,将原矩阵和求出的最大值全部输出

#include<stdio.h>
void main()  
{  
    int a[4][3],s[4],i,j,k;  
    for(i=0;i<4;i++)  
         for(j=0;j<3;j++)
            scanf("%d",*(a+i)+j);  
  
    for(i=0;i<4;i++)  
     { 
       *(s+i)= *(*(a+i));  
         for(j=1;j<3;j++)  
           if(*(s+i) < *(*(a+i)+j))  
              *(s+i)= *(*(a+i)+j);  
      }  
  
    for(i=0;i<4;i++)  
     {
        printf("Row=%d Max=%d",i,s[i] );  
        printf("\n");  
     }  
}

7,求一个3*5的矩阵各列元素的最大值,将原矩阵和求出的最大值全部输出

#include<stdio.h>
void main()  
{  
 int a[3][5],s[3],i,j,k;  
 for(i=0;i<3;i++)  
 for(j=0;j<5;j++)
  scanf("%d",*(a+i)+j);  
  
 for(i=0;i<3;i++)  
 { *(s+i)= *(*(a+j));  
 for(j=1;j<5;j++)  
 if(*(s+i) < *(*(a+i)+j))  
 *(s+i)= *(*(a+i)+j);  
 }  
  
 for(i=0;i<3;i++)  
 {
  printf("Line=%d Max=%d",j,s[j] );  
 printf("\n");  
 }  

8,求一个3*4的矩阵各列元素的平均值;将原矩阵和求出的平均值全部输出

#include<stdio.h>
void main()  
{  
 int a[4][3],s[4],i,j,k;  
 for(i=0;i<4;i++)  
  for(j=0;j<3;j++)
   scanf("%d",*(a+i)+j);
  
  for(i=0;i<4;i++)
  {
   k=0;
   for(j=0;j<3;j++)
    k+=a[i][j];
   printf("第%d行的平均值是%d",i+1,k);
   printf("\n");
  }
}

9,求一个4*3的矩阵各行元素的平均值;将原矩阵和求出的平均值全部输出

#include<stdio.h>
void main()  
{  
 int a[4][3],s[4],i,j,k;  
 for(i=0;i<4;i++)  
  for(j=0;j<3;j++)
   scanf("%d",*(a+i)+j);
  
  for(i=0;i<4;i++)
  {
   k=0;
   for(j=0;j<3;j++)
    k+=a[i][j];
   printf("第%d行的平均值是%d",i+1,k);
   printf("\n");
  }
}



  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 数值计算矩阵求逆是一种重要的数学计算过程,可以使用C语言编程实现。下面是一个基本的矩阵求逆算法的程序示例: ```c #include <stdio.h> // 定义矩阵大小 #define N 3 // 打印矩阵 void printMatrix(float matrix[N][N]) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { printf("%.2f ", matrix[i][j]); } printf("\n"); } printf("\n"); } // 矩阵求逆 void matrixInverse(float matrix[N][N]) { float identity[N][N]; float ratio, temp; int i, j, k; // 构造单位矩阵 for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { if(i == j) { identity[i][j] = 1; } else { identity[i][j] = 0; } } } // 高斯-约当消元法求逆 for(i = 0; i < N; i++) { ratio = matrix[i][i]; for(j = 0; j < N; j++) { matrix[i][j] /= ratio; identity[i][j] /= ratio; } for(k = 0; k < N; k++) { if(k != i) { ratio = matrix[k][i]; for(j = 0; j < N; j++) { matrix[k][j] -= ratio * matrix[i][j]; identity[k][j] -= ratio * identity[i][j]; } } } } printf("逆矩阵:\n"); printMatrix(identity); } int main() { float matrix[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; printf("原始矩阵:\n"); printMatrix(matrix); matrixInverse(matrix); return 0; } ``` 该程序在C语言中实现了一个基本的矩阵求逆算法。它使用高斯-约当消元法来求解逆矩阵,首先构造一个单位矩阵,然后通过一系列的消元操作将原始矩阵转化为单位矩阵,此时单位矩阵所对应的就是原始矩阵的逆矩阵。最后,通过调用`matrixInverse`函数,传入一个3x3大小的矩阵,即可计算并输出矩阵。 ### 回答2: 数值计算矩阵求逆是一种常见的数值算法,可以使用C语言编写。以下是一个大致的程序示例: #include <stdio.h> #define N 3 // 矩阵的维度 // 函数声明 int inverseMatrix(double A[][N], double invA[][N]); void printMatrix(double matrix[][N]); int main() { // 定义原始矩阵A和逆矩阵invA double A[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; double invA[N][N]; // 调用求逆函数 int success = inverseMatrix(A, invA); if (success) { printf("矩阵A的逆矩阵为:\n"); printMatrix(invA); } else { printf("矩阵A不可逆!\n"); } return 0; } // 求矩阵的逆矩阵 int inverseMatrix(double A[][N], double invA[][N]) { // 请在这里实现计算矩阵的逆矩阵算法 // 返回是否成功求逆,成功返回1,失败返回0 return 1; } // 打印矩阵 void printMatrix(double matrix[][N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%f ", matrix[i][j]); } printf("\n"); } } 该程序主要包含了两个函数:inverseMatrix和printMatrix。 invertMatrix函数负责计算给定矩阵的逆矩阵。在该函数中,你需要实现求逆矩阵的具体算法。根据不同的数值计算算法,计算逆矩阵有多种方法,比如高斯-约当消元法、LU分解等。根据你的具体需求选择合适的方法来计算逆矩阵。该函数需要返回1表示成功求逆,返回0表示矩阵不可逆。 printMatrix函数用于打印矩阵。你可以根据需要对打印的格式进行修改。 在main函数中,我们定义了一个3x3的矩阵A,并预留了一个与A维度相同的矩阵invA用于存储逆矩阵。调用inverseMatrix函数计算矩阵A的逆矩阵,并根据计算是否成功进行相应的输出。 ### 回答3: 数值计算矩阵求逆是一种常见的计算矩阵逆的算法,其中最常用的算法就是高斯-约当消元法。下面是用C语言实现的一个简单的矩阵求逆算法: ```c #include <stdio.h> #define SIZE 3 void printMatrix(double matrix[SIZE][SIZE]); void swap(double* a, double* b); void inverseMatrix(double matrix[SIZE][SIZE], double inverse[SIZE][SIZE]); int main() { double matrix[SIZE][SIZE] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; double inverse[SIZE][SIZE]; inverseMatrix(matrix, inverse); printf("原始矩阵:\n"); printMatrix(matrix); printf("逆矩阵:\n"); printMatrix(inverse); return 0; } void printMatrix(double matrix[SIZE][SIZE]) { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%f ", matrix[i][j]); } printf("\n"); } printf("\n"); } void swap(double* a, double* b) { double temp = *a; *a = *b; *b = temp; } void inverseMatrix(double matrix[SIZE][SIZE], double inverse[SIZE][SIZE]) { // 初始化单位矩阵 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { inverse[i][j] = (i == j) ? 1 : 0; } } for (int i = 0; i < SIZE; i++) { // 如果矩阵[i][i]为0,交换该行和下一行 if (matrix[i][i] == 0) { for (int j = i + 1; j < SIZE; j++) { if (matrix[j][i] != 0) { for (int k = 0; k < SIZE; k++) { swap(&matrix[i][k], &matrix[j][k]); swap(&inverse[i][k], &inverse[j][k]); } break; } } } // 将主对角线上的元素变为1 double factor = matrix[i][i]; for (int j = 0; j < SIZE; j++) { matrix[i][j] /= factor; inverse[i][j] /= factor; } // 消元得到上三角矩阵 for (int j = i + 1; j < SIZE; j++) { double factor = matrix[j][i]; for (int k = 0; k < SIZE; k++) { matrix[j][k] -= factor * matrix[i][k]; inverse[j][k] -= factor * inverse[i][k]; } } } for (int i = SIZE - 1; i >= 0; i--) { // 消元得到对角线为1的矩阵 for (int j = i - 1; j >= 0; j--) { double factor = matrix[j][i]; for (int k = 0; k < SIZE; k++) { matrix[j][k] -= factor * matrix[i][k]; inverse[j][k] -= factor * inverse[i][k]; } } } } ``` 上述程序中,我们定义了一个`printMatrix`函数来打印矩阵,一个`swap`函数用于交换两个数的值。`inverseMatrix`函数用于计算矩阵的逆。首先,我们初始化一个单位矩阵作为逆矩阵的初始值。然后,通过高斯-约当消元法来将原始矩阵转化为上三角矩阵,并且将对应的操作应用到逆矩阵上。最后,我们再次应用高斯-约当消元法将上三角矩阵变为对角线为1的矩阵,并将对应的操作应用到逆矩阵上。输出结果即为原始矩阵和逆矩阵的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值