C语言——矩阵转置

矩阵转置的原理:行元素变成列元素,列元素变成行元素

例如:

\begin{bmatrix} 1 &2 &3 &4 \\ 5&6 &7 &8 \\ 9 &10 &11 &12 \end{bmatrix}\rightarrow \begin{bmatrix} 1 &5 &9 \\ 2&6 &10 \\ 3&7 &11 \\ 4&8 &12 \end{bmatrix}

矩阵转置代码 

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>

//矩阵转置
double** Matrix_T(double** arr)
{
    if(arr==NULL)exit(-1);
	int row = (int)_msize(arr) / (int)sizeof(double*);
	int col = (int)_msize(*arr) / (int)sizeof(double);
	double** T = (double**)malloc(sizeof(double*) * col);
	int i = 0;
	int j = 0;
	if (T != NULL)
	{
		for (i = 0; i < col; i++)
		{
			T[i] = (double*)malloc(sizeof(double) * row);
		}
	}
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < row; j++)
		{
			T[i][j] = arr[j][i];
		}
	}
	return T;
}

上述代码中:

  • 首先判断传入指针是否为空
  • 然后判断矩阵的维数,这部分在C语言判断矩阵维数中有详细讲解
  • 为转置后的矩阵开辟空间
  • 进行矩阵装置,行列互换传参 

上述方法使用的是malloc开辟的矩阵,该方法相对于用二维数组存储矩阵有以下几种优势:

1)函数传参时不用输入行列,只需传入指针

2)矩阵的大小可以未知,矩阵维数可以更改

3)不需要宏定义,程序可移植性高

malloc开辟矩阵的代码如下:

double** Make_Matrix(int row, int col)
{
	int i, j;
	double** arr = (double**)malloc(sizeof(double*) * row);
	if (arr != NULL)
	{
		for (i = 0; i < row; i++)
		{
			arr[i] = (double*)malloc(sizeof(double) * col);
		}
	}
	return arr;
}

该方法在C语言malloc开辟矩阵中有详细介绍。 

测试:

为了方便测试,再加入初始化矩阵和打印矩阵两个函数

初始化函数 

void Init_Matrix(double** arr)
{
	int i, j;
	int row = (int)_msize(arr) / (int)sizeof(double*);
	int col = (int)_msize(*arr) / (int)sizeof(double);
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = pow(i,j);
		}
	}
}

 为了更加直观,让每个元素等于 i 的 j 次方

打印函数 

//打印矩阵
void print(double** arr)
{
	putchar('\n');
	int i, j, row, col;
	row = (int)_msize(arr) / (int)sizeof(double*);
	col = (int)_msize(*arr) / (int)sizeof(double);
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf("%8.3lf ", arr[i][j]);
		}
		putchar('\n');
	}
}

主函数测试 

int main()
{
	int i = 3;
	int j = 5;
	double** arr = Make_Matrix(i, j);
	Init_Matrix(arr);
	double** res = Matrix_T(arr);
	printf("原矩阵:>");
	print(arr);
	printf("逆矩阵:>");
	print(res);
	return 0;
}

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
平方根法(Cholesky分解法)是求解对称正定矩阵的线性方程组的一种有效方法。对于一个对称正定矩阵A,可以将其分解为LL^T的形式,其中L是一个下三角矩阵,L^T是其转置矩阵,然后就可以通过前代和后代求解方程组。 以下是C语言实现改进的平方根法求解方程组的代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define N 3 //方程组的阶数 int cholesky(double a[][N], double b[], double x[]) { int i, j, k; double sum; double l[N][N]; //下三角矩阵 //Cholesky分解 for (i = 0; i < N; i++) { sum = 0.0; for (k = 0; k < i; k++) sum += l[i][k] * l[i][k]; l[i][i] = sqrt(a[i][i] - sum); for (j = i + 1; j < N; j++) { sum = 0.0; for (k = 0; k < i; k++) sum += l[j][k] * l[i][k]; l[j][i] = (a[j][i] - sum) / l[i][i]; } } //前代求解Ly=b for (i = 0; i < N; i++) { sum = b[i]; for (j = 0; j < i; j++) sum -= l[i][j] * x[j]; x[i] = sum / l[i][i]; } //后代求解L^Tx=y for (i = N - 1; i >= 0; i--) { sum = x[i]; for (j = i + 1; j < N; j++) sum -= l[j][i] * x[j]; x[i] = sum / l[i][i]; } return 0; } int main() { double a[N][N] = {{4, -2, 2}, {-2, 3, -1}, {2, -1, 3}}; //系数矩阵 double b[N] = {7, 4, 10}; //常数向量 double x[N]; //解向量 int i; cholesky(a, b, x); printf("The solution is:\n"); for (i = 0; i < N; i++) printf("x[%d] = %f\n", i, x[i]); return 0; } ``` 这里以一个3阶方程组为例进行演示,通过调用cholesky函数求解方程组。函数中的a为系数矩阵,b为常数向量,x为解向量。程序输出的结果为方程组的解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是元笙阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值