精华内容
下载资源
问答
  • C语言矩阵转置

    千次阅读 2020-04-02 19:09:29
    编写函数,求一个3×3矩阵转置矩阵。 (1)编程提示 转置矩阵,将原矩阵的行变为列,列变为行。注意,通过指针访问二维数组时的方法。本题采用的是指向数组元素的指针变量。 输入样例: 1 2 3 4 5 6 7 8 9 输出...

    编写函数,求一个3×3矩阵的转置矩阵。
    (1)编程提示
    转置矩阵,将原矩阵的行变为列,列变为行。注意,通过指针访问二维数组时的方法。本题采用的是指向数组元素的指针变量。


    输入样例:

    1 2 3
    4 5 6
    7 8 9

    输出样例:
    1 4 7
    2 5 8
    3 6 9


    注意:此题输出的每行的最后一个数不能有空格
    #include <stdio.h>
    void Trans(int(*p)[3])
    {
    	int t, i, j;
    	for (i = 0; i < 3; i++)
    	{
    		for (j = 0; j < i; j++)
    		{
    			t = *(*(p + i) + j);
    			*(*(p + i) + j) = *(*(p + j) + i);
    			*(*(p + j) + i) = t;
    		}
    	}
    
    }
    void main()
    {
    	int a[3][3], i, j;
    	for (i = 0; i < 3; i++)//原矩阵输入
    	{
    		for (j = 0; j < 3; j++)
    		{
    			scanf("%d", &a[i][j]);
    		}
    	}
    	Trans(a);
    	for (i = 0; i < 3; i++)//转置输出
    	{
    		for (j = 0; j < 2; j++)
    		{
    			printf("%d ", a[i][j]);
    		}
            printf("%d",a[i][j]);	//每行最后一个数
    		printf("\n");
    	}
    }
    
    
    展开全文
  • C语言:用函数调用实现矩阵转置

    千次阅读 2020-03-12 17:35:38
    } } printf("矩阵a为:\n"); for(i=0;i;i++){ for(j=0;j;j++){ printf("%4d",a[i][j]); } printf("\n"); } convert(a); printf("转置后为:\n"); for(i=0;i;i++){ for(j=0;j;j++){ printf("%...
    #include<stdio.h>
    #include <stdlib.h>
    #include<math.h>
    int b[3][3];        //b数组作为全局变量,
    int main(){
        void convert(int a[3][3]);
    	int a[3][3];
    	int i,j;
    	printf("输入一个3*3的数组:\n");
    	for(i=0;i<3;i++){
    		for(j=0;j<3;j++){
    		scanf("%d",&a[i][j]);
    		}
    	}
    	printf("矩阵a为:\n");
    	for(i=0;i<3;i++){
    		for(j=0;j<3;j++){
    			printf("%4d",a[i][j]);
    		}
    		printf("\n");
    	}
    	convert(a);
    	printf("转置后为:\n");
    	for(i=0;i<3;i++){
    		for(j=0;j<3;j++){
    		printf("%4d",b[i][j]);
    		}
    		printf("\n");
    	}
    
    	printf("\n");
    	system("pause");
    	return 0;
    }
    void convert(int a[3][3]){  /*不建立第二个数组也可完成,此
    							时需设置temp存储使a[i][j]和a[j][i]交换*/
    	int i,j;
    	for(i=0;i<3;i++){
    		for(j=0;j<3;j++){
    			b[i][j]=a[j][i];
    		}
    	}
    }
    

    运行结果在这里插入图片描述为:

    展开全文
  • C语言实现常见的矩阵运算函数

    万次阅读 多人点赞 2015-12-19 15:58:24
    C语言 矩阵转置函数 矩阵加(减)法函数 矩阵乘法函数 矩阵求逆函数 矩阵乔里斯基分解函数

    1.矩阵转置函数

    void matrix_t(double **a_matrix, const double **b_matrix, int krow, int kline)
    
    //	a_matrix:转置后的矩阵
    //	b_matrix:转置前的矩阵
    //	krow    :行数
    //	kline   :列数
    
    {
    	int k, k2;   
    
    	for (k = 0; k < krow; k++)
    	{
    		for(k2 = 0; k2 < kline; k2++)
    		{
    			a_matrix[k2][k] = b_matrix[k][k2];
    		}
    	}
    }
    
    2.矩阵加(减)法函数
    void matrix_a(double **a_matrix, const double **b_matrix, const double **c_matrix, 
    					int krow, int kline, int ktrl)
    
    //	a_matrix=b_matrix+c_matrix
    //	 krow   :行数
    //	 kline  :列数
    //	 ktrl   :大于0: 加法  不大于0:减法
    
    {
    	int k, k2;
    
    	for (k = 0; k < krow; k++)
    	{
    		for(k2 = 0; k2 < kline; k2++)
    		{
    			a_matrix[k][k2] = b_matrix[k][k2]
    				+ ((ktrl > 0) ? c_matrix[k][k2] : -c_matrix[k][k2]); 
    		}
    	}
    }
    3.矩阵乘法函数

    void matrix_m(double **a_matrix, const double **b_matrix, const double **c_matrix,
    				int krow, int kline, int kmiddle, int ktrl)
    
    //	a_matrix=b_matrix*c_matrix
    //	krow  :行数
    //	kline :列数
    //	ktrl  :	大于0:两个正数矩阵相乘 不大于0:正数矩阵乘以负数矩阵
    
    {
    	int k, k2, k4;
    	double stmp;
    
    	for (k = 0; k < krow; k++)     
    	{
    		for (k2 = 0; k2 < kline; k2++)   
    		{
    			stmp = 0.0;
    			for (k4 = 0; k4 < kmiddle; k4++)  
    			{
    				stmp += b_matrix[k][k4] * c_matrix[k4][k2];
    			}
    			a_matrix[k][k2] = stmp;
    		}
    	}
    	if (ktrl <= 0)   
    	{
    		for (k = 0; k < krow; k++)
    		{
    			for (k2 = 0; k2 < kline; k2++)
    			{
    				a_matrix[k][k2] = -a_matrix[k][k2];
    			}
    		}
    	}
    }
    4.矩阵求逆函数

    int  matrix_inv(double **a_matrix, int ndimen)
    
    //	a_matrix:矩阵
    //	ndimen :维数
    
    {
    	double tmp, tmp2, b_tmp[20], c_tmp[20];
    	int k, k1, k2, k3, j, i, j2, i2, kme[20], kmf[20];
    	i2 = j2 = 0;
    
    	for (k = 0; k < ndimen; k++)  
    	{
    		tmp2 = 0.0;
    		for (i = k; i < ndimen; i++)  
    		{
    			for (j = k; j < ndimen; j++)  
    			{
    				if (fabs(a_matrix[i][j] ) <= fabs(tmp2)) 
    					continue;
    				tmp2 = a_matrix[i][j];
    				i2 = i;
    				j2 = j;
    			}  
    		}
    		if (i2 != k) 
    		{
    			for (j = 0; j < ndimen; j++)   
    			{
    				tmp = a_matrix[i2][j];
    				a_matrix[i2][j] = a_matrix[k][j];
    				a_matrix[k][j] = tmp;
    			}
    		}
    		if (j2 != k) 
    		{
    			for (i = 0; i < ndimen; i++)  
    			{
    				tmp = a_matrix[i][j2];
    				a_matrix[i][j2] = a_matrix[i][k];
    				a_matrix[i][k] = tmp;
    			}    
    		}
    		kme[k] = i2;
    		kmf[k] = j2;
    		for (j = 0; j < ndimen; j++)  
    		{
    			if (j == k)   
    			{
    				b_tmp[j] = 1.0 / tmp2;
    				c_tmp[j] = 1.0;
    			}
    			else 
    			{
    				b_tmp[j] = -a_matrix[k][j] / tmp2;
    				c_tmp[j] = a_matrix[j][k];
    			}
    			a_matrix[k][j] = 0.0;
    			a_matrix[j][k] = 0.0;
    		}
    		for (i = 0; i < ndimen; i++)  
    		{
    			for (j = 0; j < ndimen; j++)  
    			{
    				a_matrix[i][j] = a_matrix[i][j] + c_tmp[i] * b_tmp[j];
    			}  
    		}
    	}
    	for (k3 = 0; k3 < ndimen;  k3++)   
    	{
    		k  = ndimen - k3 - 1;
    		k1 = kme[k];
    		k2 = kmf[k];
    		if (k1 != k)   
    		{
    			for (i = 0; i < ndimen; i++)  
    			{
    				tmp = a_matrix[i][k1];
    				a_matrix[i][k1] = a_matrix[i][k];
    				a_matrix[i][k] = tmp;
    			}  
    		}
    		if (k2 != k)   
    		{
    			for(j = 0; j < ndimen; j++)  
    			{
    				tmp = a_matrix[k2][j];
    				a_matrix[k2][j] = a_matrix[k][j];
    				a_matrix[k][j] = tmp;
    			}
    		}
    	}
    	return (0);
    }
    
    5.矩阵乔里斯基分解函数
    void chol(double **a_matrix, const double **b_matrix, int ndimen)
    
    //	输入参数:
    //		b_matrix:  对称正定方阵    ndimen: 矩阵维数
    //	返回值:
    //		a_matrix: 下三角矩阵
    
    {
    	int i, j, r;
    	double m = 0;   
    	static double **c_matrix;
    	static int flag = 0;
    
    	if (flag == 0)
    	{
    		flag = 1;
    		c_matrix = (double **)malloc(ndimen * sizeof(double *));
    
    		for (i = 0; i < ndimen; i++)
    			c_matrix[i] = (double *)malloc(ndimen * sizeof(double));
    	}
    
    	for (i = 0; i < ndimen; i++)
    	{
    		for (j = 0; j < ndimen; j++) 
    			c_matrix[i][j] = 0;
    	}
    
    	c_matrix[0][0] = sqrt(b_matrix[0][0]);
    
    	for (i = 1; i < ndimen; i++)
    	{
    		if (c_matrix[0][0] != 0) 
    			c_matrix[i][0] = b_matrix[i][0] / c_matrix[0][0];
    	}
    
    	for (i = 1; i < ndimen; i++)
    	{
    		for (r = 0; r < i; r++)		m = m + c_matrix[i][r] * c_matrix[i][r];
    
    		c_matrix[i][i] = sqrt(b_matrix[i][i] - m);
    		m = 0.0;
    
    		for (j = i + 1; j < ndimen; j++)
    		{
    			for (r = 0; r < i; r++)		m = m + c_matrix[i][r] * c_matrix[j][r];
    			c_matrix[j][i] = (b_matrix[i][j] - m) / c_matrix[i][i];
    			m = 0;
    		}
    	}
    
    	for (i = 0; i < ndimen; i++)
    	{
    		for (j = 0; j < ndimen; j++)	
    			a_matrix[i][j] = c_matrix[i][j];
    	}
    }




    展开全文
  • C语言数组转置,通过一维数组最后的一个单元用来作临时缓存单元(a[n*m]) 这个是在原有基础上移动次数和空间占用最小的方案 矩阵的头尾量,因为在数组中的位置都不改变,都是不需要移动的,很多就地转换忽略掉了这...

    C语言数组转置,通过一维数组最后的一个单元用来作临时缓存单元(a[n*m])
    这个是在原有基础上移动次数和空间占用最小的方案
    矩阵的头尾量,因为在数组中的位置都不改变,都是不需要移动的,很多就地转换忽略掉了这一点,导致了几次不必要的移动。

    矩阵就地转置

    #include "stdio.h"
    #include "stdlib.h"
    int moveNum=0;//统计移动次数的变量:矩阵内部数据移动请调用指定Mi2j()函数 
    struct Mat{
    //结构内的函数,可以直接访问本结构体内的所有成员(变量) 
        int *data;//矩阵的值(一维数组)
        int row,col;//矩阵的行,列数   
    };
    void MatInit(struct Mat *M,int m,int n)//构造函数:对矩阵初始化 
    {   int i;
        M->row=m;M->col=n;
        M->data=(int*)malloc(sizeof(int)*(m*n+1));//data[m*n]为临时存储单元 
        for(i=0;i<m*n;i++) M->data[i]=i;
    }
    void output(struct Mat M){//输出矩阵
      int i,j,k=0;char ch[500];
      for(i=0;i<M.row;i++){
        for(j=0;j<M.col;j++)
          k+=sprintf(ch+k,"%3d",M.data[i*M.col+j]);
        k+=sprintf(ch+k,"\n");
      }
        k+=sprintf(ch+k,"---\n");
        printf("%s",ch);
         } 
    void Mi2j(struct Mat *M,int i,int j){//矩阵内部数据移动请调用本函数 
        moveNum++;M->data[j]=M->data[i];
    }
    //start
    void fun(struct Mat *M)
    {
        int len = M->row*M->col;
        for(int i = 1; i< len-1; i++)
        {
            int pre = (i%M->row)*M->col + i/M->row,next = (i%M->col)*M->row + i/M->col;
    
    
            while(pre > i && next > i && pre!= next && (pre%M->row)*M->col + pre/M->row != next) 
            {
                pre = (pre%M->row)*M->col + pre/M->row;
                next = (next%M->col)*M->row + next/M->col;
            }
            if(pre <= i || next <= i)//此环已被处理过
                continue;
            int cur =i;
            Mi2j(M,i,len);
            pre = (cur%M->row)*M->col + cur/M->row;
            while(pre != i)//移动环中的元素
            {
                Mi2j(M,pre,cur);
    
                cur = pre;
                pre = (cur%M->row)*M->col + cur/M->row;
            }
            Mi2j(M,len,cur);
            // matrix[cur] = val;
        } 
        int x=M->col;
        M->col=M->row;
        M->row=x;   
    }
    //end
    int main(){
      int m,n;
      scanf("%d%*c%d",&m,&n);
      struct Mat A;
      MatInit(&A,m,n);  output(A);
      fun(&A);  output(A);
      printf("moveNum:%d\n",moveNum);
        return 0;
    }
    
    
    

    这题源代码由Happyer 在超新布置的作业,我只是补齐了fun()函数的内容,核心思想是Happyer 在PTA 上出的一题函数题(6-6 矩阵就地转置 )。

    如错误或更好的方案欢迎指出!!!
    有没有办法能减少,判断次数呢?

    展开全文
  • 1141:C语言-转置矩阵

    2021-01-05 10:48:31
    写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 输入格式 一个3x3的矩阵 输出格式 转置后的矩阵 输入样例 1 2 3 4 5 6 7 8 9 输出样例 1 4 7 2 5 8 3 6 9 多观察找找规律,考察对下标的...
  • 此程序是用C语言编写矩阵函数包(矩阵的加,减,乘,转置矩阵,逆矩阵),是一个完整的程序,复制后可以直接运行的。
  • void TransArray(int arr[3][3]) //函数2:矩阵转置 { int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("%d ",arr[j][i]); } printf("\n"); } } void main() //主函数 { ...
  • printf("转置后的矩阵: "); for (i = 0;i ;i ) { for (j = 0;j ;j ) printf("%d ",a[i][j]); printf(" "); } return 0; } void zhuanzhi (int (*p)[3]) { int i,j,s = 1,g = 0; int (*z)[3]; z = p; for (i = 0;i ;...
  • 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。 输入 一个3x3的矩阵 输出 转置后的矩阵 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 6 9 来源/分类 C语言 题目截图: 思路: ...
  • C语言 写一函数,将一个3*3的整型矩阵转置 用指针

    千次阅读 多人点赞 2020-05-19 13:40:19
    #include<stdio.h> void convert(int (*p)[3]) { int i,j,temp; for(i=0;i<3;i++) for(j=0;j<i;j++) { temp=*(*(p+i)+j); *(*(p+i)+j)=*(*(p+j)+i); *(*(p+j)+i)=temp;... for(.
  • 此程序用指针实现任意矩阵转置的子函数,先动态的开辟一段内存空间用以存放转置后的矩阵
  • /*写一函数,将一个3x3的整型矩阵转置,用指针实现*/#include #include #define SIZE 3int main(){int **a = (int **)malloc(sizeof(int *)*SIZE);//二维数组动态分配内存int i,j,t;for(i=0; i*(a+i) = (int *)...
  • 3*3矩阵转置 C语言

    千次阅读 2020-12-16 17:21:55
    编写一个函数(参数用指针)将一个3*3矩阵转置。 输入 输入一个3*3的矩阵,以二维数组的形式进行存储,如:[[1,2,3],[4,5,6],[7,8,9]],注意 输入是:1 2 3 4 5 6 7 8 9 输出 输出该矩阵的转置,将其打印输出 样例 ...
  • 用指向一维数组的指针变量即二维数组的行指针作为函数参数,实现矩阵转置。 按如下函数原型编程计算并输出m×n阶矩阵的转置矩阵。 其中,m和n的值由用户从键盘输入。已知m和n的值都不超过10。 void Transpose(int (*...
  • 1. 利用函数调用,完成教材165页习题中的第7题(魔方阵) 魔方阵说明: 魔方阵是一个N*N的矩阵; 该矩阵每一行,每一列,对角线之和都相等; 3阶魔方阵 8 1 6 3 5 7 4 9 2 每一行之和: 8+1+6=15; 3+5+7=15; 4+9...
  • 目的:写一个函数,将一个3×3的整型矩阵转置(指针加函数) 功能:指针加函数的基础应用 */ #include<stdio.h> #define N 3//N为多少都是一样的 void zz(int(*)[N],int(*)[N]);//定义转制函数 int main...
  • (指针的方法处理)写一个函数,将一个3×3的整型矩阵转置
  • 题目:写一函数,将一个3×3的整形矩阵转置。 #include&lt;stdio.h&gt; int main() { void move(int *s); int a[3][3];int i=0; int *p=&amp;a[0][0]; printf("请输入一个3*3的数组:\n"...
  • C语言)指针转置矩阵

    千次阅读 2020-04-12 16:54:51
    2.编写函数,求一个3×3矩阵转置矩阵。 (1)编程提示 转置矩阵,将原矩阵的行变为列,列变为行。注意,通过指针访问二维数组时的方法。本题采用的是指向数组元素的指针变量。 输入样例: 1 2 3 4 5 6 7 8 9 输出...
  • /*一题目叙述:个 4 * 4 数组 a 进行矩阵转置 输出格式 完整的目标矩阵 ...//这两个函数都是矩阵转置函数,但是他们的实现方式不同, //一个是传统方式,一个是用指针解引用的形式 void convert2(int a[4][4])
  • 5、 写一函数,将一个3×3的矩阵转置。 */ #include #include void main() { int a[3][3]; int b[3][3]; for (int i=0;i;i++)//给数组赋值 { for (int j=0;j;j++) { a[i][j]=rand()%100; printf(
  • #include int main() { int i,j; void Z_Z(int x[3][3],int y[3][3]); int b[3][3]; int a[3][3]; for(i=0;i { for(j=0;j scanf("%d",&b[i][j]);...//Z_Z表示转置的意思 for(i=0;i { for(j=0;j  

空空如也

空空如也

1 2 3 4 5 6
收藏数 103
精华内容 41
关键字:

c语言矩阵转置函数

c语言 订阅