图像处理之基础---矩阵求逆实现
2014-09-05 15:33
357 查看
最近做一个加密算法遇到需要计算矩阵的逆,闲着无聊,记录一下,以后免得再麻烦。
[cpp] view plaincopyprint?
#include
#include
#include
#define MAX 20
#define E 0.000000001
/**
* 计算矩阵src的模
*/
double calculate_A( double src[][MAX], int n )
{
int i,j,k,x,y;
double tmp[MAX][MAX], t;
double result = 0.0;
if( n == 1 )
{
return src[0][0];
}
for( i = 0; i < n; ++i )
{
for( j = 0; j < n - 1; ++j )
{
for( k = 0; k < n - 1; ++k )
{
x = j + 1;
y = k >= i ? k + 1 : k;
tmp[j][k] = src[x][y];
}
}
t = calculate_A( tmp, n - 1 );
if( i % 2 == 0 )
{
result += src[0][i] * t;
}
else
{
result -= src[0][i] * t;
}
}
return result;
}
/**
* 计算伴随矩阵
*/
void calculate_A_adjoint( double src[MAX][MAX], double dst[MAX][MAX], int n )
{
int i, j, k, t, x, y;
double tmp[MAX][MAX];
if( n == 1 )
{
dst[0][0] = 1;
return;
}
for( i = 0; i < n; ++i )
{
for( j = 0; j < n; ++j )
{
for( k = 0; k < n - 1; ++k )
{
for( t = 0; t < n - 1; ++t )
{
x = k >= i ? k + 1 : k ;
y = t >= j ? t + 1 : t;
tmp[k][t] = src[x][y];
}
}
dst[j][i] = calculate_A( tmp, n - 1 );
if( ( i + j ) % 2 == 1 )
{
dst[j][i] = -1*dst[j][i];
}
}
}
}
/**
* 得到逆矩阵
*/
int calculate_A_inverse( double src[MAX][MAX], double dst[MAX][MAX], int n )
{
double A = calculate_A( src, n );
double tmp[MAX][MAX];
int i, j;
if ( fabs( A - 0 ) <= E )
{
printf("不可能有逆矩阵!\n");
return 0;
}
calculate_A_adjoint( src, tmp, n );
for( i = 0; i < n; ++i )
{
for( j = 0; j < n; ++j )
{
dst[i][j] = (double)( tmp[i][j] / A );
}
}
return 1;
}
/**
* 输出矩形查看
*/
void print_M( double M[][MAX], int n )
{
int i, j;
for ( i = 0; i < n; ++i )
{
for ( j = 0; j < n; ++j )
{
printf("%lf ", M[i][j]);
}
printf("\n");
}
}
/**
* main
*/
int main()
{
/**
* 测试矩阵
*/
double test[MAX][MAX], dst[MAX][MAX];
int n = 3;
int is_exist;
/**
* 构造最简单的:
* 1, 0, 0,
* 0, 2, 0,
* 0, 0, 5
*/
memset( test, 0, sizeof( test ) );
test[0][0] = 1.0;
test[1][1] = 2.0;
test[2][2] = 5.0;
is_exist = calculate_A_inverse( test, dst, n );
if ( is_exist )
{
print_M(dst, n);
}
else
{
printf("不存在!\n");
}
return 0;
}
http://blog.csdn.net/shanshanpt/article/details/16820325
[cpp] view plaincopyprint?
#include
#include
#include
#define MAX 20
#define E 0.000000001
/**
* 计算矩阵src的模
*/
double calculate_A( double src[][MAX], int n )
{
int i,j,k,x,y;
double tmp[MAX][MAX], t;
double result = 0.0;
if( n == 1 )
{
return src[0][0];
}
for( i = 0; i < n; ++i )
{
for( j = 0; j < n - 1; ++j )
{
for( k = 0; k < n - 1; ++k )
{
x = j + 1;
y = k >= i ? k + 1 : k;
tmp[j][k] = src[x][y];
}
}
t = calculate_A( tmp, n - 1 );
if( i % 2 == 0 )
{
result += src[0][i] * t;
}
else
{
result -= src[0][i] * t;
}
}
return result;
}
/**
* 计算伴随矩阵
*/
void calculate_A_adjoint( double src[MAX][MAX], double dst[MAX][MAX], int n )
{
int i, j, k, t, x, y;
double tmp[MAX][MAX];
if( n == 1 )
{
dst[0][0] = 1;
return;
}
for( i = 0; i < n; ++i )
{
for( j = 0; j < n; ++j )
{
for( k = 0; k < n - 1; ++k )
{
for( t = 0; t < n - 1; ++t )
{
x = k >= i ? k + 1 : k ;
y = t >= j ? t + 1 : t;
tmp[k][t] = src[x][y];
}
}
dst[j][i] = calculate_A( tmp, n - 1 );
if( ( i + j ) % 2 == 1 )
{
dst[j][i] = -1*dst[j][i];
}
}
}
}
/**
* 得到逆矩阵
*/
int calculate_A_inverse( double src[MAX][MAX], double dst[MAX][MAX], int n )
{
double A = calculate_A( src, n );
double tmp[MAX][MAX];
int i, j;
if ( fabs( A - 0 ) <= E )
{
printf("不可能有逆矩阵!\n");
return 0;
}
calculate_A_adjoint( src, tmp, n );
for( i = 0; i < n; ++i )
{
for( j = 0; j < n; ++j )
{
dst[i][j] = (double)( tmp[i][j] / A );
}
}
return 1;
}
/**
* 输出矩形查看
*/
void print_M( double M[][MAX], int n )
{
int i, j;
for ( i = 0; i < n; ++i )
{
for ( j = 0; j < n; ++j )
{
printf("%lf ", M[i][j]);
}
printf("\n");
}
}
/**
* main
*/
int main()
{
/**
* 测试矩阵
*/
double test[MAX][MAX], dst[MAX][MAX];
int n = 3;
int is_exist;
/**
* 构造最简单的:
* 1, 0, 0,
* 0, 2, 0,
* 0, 0, 5
*/
memset( test, 0, sizeof( test ) );
test[0][0] = 1.0;
test[1][1] = 2.0;
test[2][2] = 5.0;
is_exist = calculate_A_inverse( test, dst, n );
if ( is_exist )
{
print_M(dst, n);
}
else
{
printf("不存在!\n");
}
return 0;
}
http://blog.csdn.net/shanshanpt/article/details/16820325
相关文章推荐
- 深度学习FPGA实现基础知识17(图像处理卷积运算 矩阵卷积)
- 2.深度学习FPGA实现基础知识17(图像处理卷积运算 矩阵卷积)
- 【图像处理】矩阵运算代码实现2-矩阵求逆
- 图像处理之基础---二维卷积c实现
- 图像处理算法基础(四)---中值滤波自实现及opencv函数
- MATLAB图像处理基础知识3 稀疏矩阵变全矩阵full 保存矩阵到txt文件save
- 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
- 图像处理之基础---图像缩放中的双线性插值c实现
- matlab图像处理基础知识0(双线性插值matlab实现--调整水平和垂直放大倍数)
- 图像处理C++基础 02 ——使用读写文件的矩阵乘法
- matlab图像处理基础知识3(双线性插值matlab实现--FPGA优化)
- MATLAB图像处理基础知识3 稀疏矩阵变全矩阵full 保存矩阵到txt文件save
- 图像处理之基础---滤波器之高斯低通滤波器3c代码实现yuv,rgb
- 视频图像处理基础知识1(双线性插值算法描述及实现)
- 图像处理算法基础(六)---sobel算子自实现与opencv对比
- 图像处理之基础---傅立叶c实现
- 图像处理之基础---滤波器之高斯低通滤波器的高斯模板生成c实现
- 【图像处理】矩阵运算代码实现1
- VS2013使用C语言实现数字图像处理基础(1)
- 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)