现在的位置: 首页 > 综合 > 正文

在C中实现矩阵运算

2013年03月12日 ⁄ 综合 ⁄ 共 16653字 ⁄ 字号 评论关闭
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh

环境:

主机:XP

开发环境:mingw


功能:

在C++中实现矩阵运算


说明:

将这篇文章(http://blog.csdn.net/jdh99/article/details/7360091)中在C++下实现的矩阵运算移植到C下,以便在单片机中运算.


源代码:

matrix.h:

  1. #ifndef _MATRIX_H     
  2. #define _MATRIX_H   
  3.   
  4. //头文件     
  5. #include <stdio.h>  
      
  6. #include <stdlib.h>     
  7.     
  8. //矩阵数据结构     
  9. //二维矩阵     
  10. struct _Matrix    
  11. {     
  12.     int m;    
  13.     int n;    
  14.     float *arr;    
  15. };   
  16.   
  17. //矩阵方法   
  18. //设置m     
  19. void matrix_set_m(struct _Matrix *m,int mm);    
  20. //设置n     
  21. void matrix_set_n(struct _Matrix *m,int nn);    
  22. //初始化     
  23. void matrix_init(struct _Matrix *m);    
  24. //释放     
  25. void matrix_free(struct _Matrix *m);    
  26. //读取i,j坐标的数据     
  27. //失败返回-31415,成功返回值     
  28. float matrix_read(struct _Matrix *m,int i,int j);    
  29. //写入i,j坐标的数据     
  30. //失败返回-1,成功返回1     
  31. int matrix_write(struct _Matrix *m,int i,int j,float val);   
  32.   
  33. //矩阵运算   
  34. //成功返回1,失败返回-1     
  35. int matrix_add(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);    
  36. //C = A - B     
  37. //成功返回1,失败返回-1     
  38. int matrix_subtract(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);    
  39. //C = A * B     
  40. //成功返回1,失败返回-1     
  41. int matrix_multiply(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);    
  42. //行列式的值,只能计算2 * 2,3 * 3     
  43. //失败返回-31415,成功返回值     
  44. float matrix_det(struct _Matrix *A);    
  45. //求转置矩阵,B = AT     
  46. //成功返回1,失败返回-1     
  47. int matrix_transpos(struct _Matrix *A,struct _Matrix *B);    
  48. //求逆矩阵,B = A^(-1)     
  49. //成功返回1,失败返回-1     
  50. int matrix_inverse(struct _Matrix *A,struct _Matrix *B);    
  51.     
  52. #endif    
#ifndef _MATRIX_H  
#define _MATRIX_H

//头文件  
#include <stdio.h>  
#include <stdlib.h>  
  
//矩阵数据结构  
//二维矩阵  
struct _Matrix  
{   
    int m;  
    int n;  
    float *arr;  
}; 

//矩阵方法
//设置m  
void matrix_set_m(struct _Matrix *m,int mm);  
//设置n  
void matrix_set_n(struct _Matrix *m,int nn);  
//初始化  
void matrix_init(struct _Matrix *m);  
//释放  
void matrix_free(struct _Matrix *m);  
//读取i,j坐标的数据  
//失败返回-31415,成功返回值  
float matrix_read(struct _Matrix *m,int i,int j);  
//写入i,j坐标的数据  
//失败返回-1,成功返回1  
int matrix_write(struct _Matrix *m,int i,int j,float val); 

//矩阵运算
//成功返回1,失败返回-1  
int matrix_add(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);  
//C = A - B  
//成功返回1,失败返回-1  
int matrix_subtract(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);  
//C = A * B  
//成功返回1,失败返回-1  
int matrix_multiply(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);  
//行列式的值,只能计算2 * 2,3 * 3  
//失败返回-31415,成功返回值  
float matrix_det(struct _Matrix *A);  
//求转置矩阵,B = AT  
//成功返回1,失败返回-1  
int matrix_transpos(struct _Matrix *A,struct _Matrix *B);  
//求逆矩阵,B = A^(-1)  
//成功返回1,失败返回-1  
int matrix_inverse(struct _Matrix *A,struct _Matrix *B);  
  
#endif  

matrix.c:

  1. #include "matrix.h"   
  2.   
  3. //矩阵方法   
  4. //设置m     
  5. void matrix_set_m(struct _Matrix *m,int mm)  
  6. {  
  7.     m->m = mm;   
  8. }  
  9.   
  10. //设置n     
  11. void matrix_set_n(struct _Matrix *m,int nn)  
  12. {  
  13.     m->n = nn;  
  14. }  
  15.   
  16. //初始化     
  17. void matrix_init(struct _Matrix *m)  
  18. {  
  19.     m->arr = (float *)malloc(m->m * m->n * sizeof(float));  
  20. }  
  21.   
  22. //释放     
  23. void matrix_free(struct _Matrix *m)  
  24. {  
  25.     free(m->arr);  
  26. }  
  27.   
  28. //读取i,j坐标的数据     
  29. //失败返回-31415,成功返回值     
  30. float matrix_read(struct _Matrix *m,int i,int j)  
  31. {  
  32.     if (i >= m->m || j >= m->n)    
  33.     {    
  34.         return -31415;    
  35.     }    
  36.         
  37.     return *(m->arr + i * m->n + j);    
  38. }  
  39.   
  40. //写入i,j坐标的数据     
  41. //失败返回-1,成功返回1     
  42. int matrix_write(struct _Matrix *m,int i,int j,float val)  
  43. {  
  44.     if (i >= m->m || j >= m->n)    
  45.     {    
  46.         return -1;    
  47.     }    
  48.         
  49.     *(m->arr + i * m->n + j) = val;    
  50.     return 1;    
  51. }  
  52.   
  53. //矩阵运算   
  54. //成功返回1,失败返回-1     
  55. int matrix_add(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C)  
  56. {  
  57.     int i = 0;    
  58.     int j = 0;    
  59.         
  60.     //判断是否可以运算     
  61.     if (A->m != B->m || A->n != B->n || \  
  62.         A->m != C->m || A->n != C->n)    
  63.     {    
  64.         return -1;    
  65.     }    
  66.     //运算     
  67.     for (i = 0;i < C->m;i++)    
  68.     {    
  69.         for (j = 0;j < C->n;j++)    
  70.         {    
  71.             matrix_write(C,i,j,matrix_read(A,i,j) + matrix_read(B,i,j));    
  72.         }    
  73.     }    
  74.         
  75.     return 1;   
  76. }  
  77.   
  78. //C = A - B     
  79. //成功返回1,失败返回-1     
  80. int matrix_subtract(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C)  
  81. {  
  82.     int i = 0;    
  83.     int j = 0;    
  84.         
  85.     //判断是否可以运算     
  86.     if (A->m != B->m || A->n != B->n || \  
  87.         A->m != C->m || A->n != C->n)    
  88.     {    
  89.         return -1;    
  90.     }    
  91.     //运算     
  92.     for (i = 0;i < C->m;i++)    
  93.     {    
  94.         for (j = 0;j < C->n;j++)    
  95.         {    
  96.             matrix_write(C,i,j,matrix_read(A,i,j) - matrix_read(B,i,j));    
  97.         }    
  98.     }    
  99.         
  100.     return 1;   
  101. }  
  102.   
  103. //C = A * B     
  104. //成功返回1,失败返回-1     
  105. int matrix_multiply(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C)  
  106. {  
  107.     int i = 0;    
  108.     int j = 0;    
  109.     int k = 0;    
  110.     float temp = 0;    
  111.         
  112.     //判断是否可以运算     
  113.     if (A->m != C->m || B->n != C->n || \  
  114.         A->n != B->m)    
  115.     {    
  116.         return -1;    
  117.     }    
  118.     //运算     
  119.     for (i = 0;i < C->m;i++)    
  120.     {    
  121.         for (j = 0;j < C->n;j++)    
  122.         {    
  123.             temp = 0;    
  124.             for (k = 0;k < A->n;k++)    
  125.             {    
  126.                 temp += matrix_read(A,i,k) * matrix_read(B,k,j);    
  127.             }    
  128.             matrix_write(C,i,j,temp);    
  129.         }    
  130.     }    
  131.         
  132.     return 1;   
  133. }  
  134.   
  135. //行列式的值,只能计算2 * 2,3 * 3  
      
  136. //失败返回-31415,成功返回值     
  137. float matrix_det(struct _Matrix *A)  
  138. {  
  139.     float value = 0;    
  140.         
  141.     //判断是否可以运算     
  142.     if (A->m != A->n || (A->m != 2 && A->m != 3))    
  143.     {    
  144.         return -31415;    
  145.     }    
  146.     //运算     
  147.     if (A->m == 2)    
  148.     {    
  149.         value = matrix_read(A,0,0) * matrix_read(A,1,1) - matrix_read(A,0,1) * matrix_read(A,1,0);    
  150.     }    
  151.     else    
  152.     {    
  153.         value = matrix_read(A,0,0) * matrix_read(A,1,1) * matrix_read(A,2,2) + \  
  154.                 matrix_read(A,0,1) * matrix_read(A,1,2) * matrix_read(A,2,0) + \  
  155.                 matrix_read(A,0,2) * matrix_read(A,1,0) * matrix_read(A,2,1) - \  
  156.                 matrix_read(A,0,0) * matrix_read(A,1,2) * matrix_read(A,2,1) - \  
  157.                 matrix_read(A,0,1) * matrix_read(A,1,0) * matrix_read(A,2,2) - \  
  158.                 matrix_read(A,0,2) * matrix_read(A,1,1) * matrix_read(A,2,0);    
  159.     }    
  160.         
  161.     return value;   
  162. }  
  163.   
  164. //求转置矩阵,B = AT     
  165. //成功返回1,失败返回-1     
  166. int matrix_transpos(struct _Matrix *A,struct _Matrix *B)  
  167. {  
  168.     int i = 0;    
  169.     int j = 0;    
  170.         
  171.     //判断是否可以运算     
  172.     if (A->m != B->n || A->n != B->m)    
  173.     {    
  174.         return -1;    
  175.     }    
  176.     //运算     
  177.     for (i = 0;i < B->m;i++)    
  178.     {    
  179.         for (j = 0;j < B->n;j++)    
  180.         {    
  181.             matrix_write(B,i,j,matrix_read(A,j,i));    
  182.         }    
  183.     }    
  184.         
  185.     return 1;    
  186. }  
  187.   
  188. //求逆矩阵,B = A^(-1)     
  189. //成功返回1,失败返回-1     
  190. int matrix_inverse(struct _Matrix *A,struct _Matrix *B)  
  191. {  
  192.     int i = 0;    
  193.     int j = 0;    
  194.     int k = 0;    
  195.     struct _Matrix m;    
  196.     float temp = 0;    
  197.     float b = 0;    
  198.         
  199.     //判断是否可以运算     
  200.     if (A->m != A->n || B->m != B->n || A->m != B->m)    
  201.     {    
  202.         return -1;    
  203.     }    
  204.         
  205.     /*  
  206.     //如果是2维或者3维求行列式判断是否可逆  
  207.     if (A->m == 2 || A->m == 3)  
  208.     {  
  209.         if (det(A) == 0)  
  210.         {  
  211.             return -1;  
  212.         }  
  213.     }  
  214.     */    
  215.         
  216.     //增广矩阵m = A | B初始化      
  217.     matrix_set_m(&m,A->m);  
  218.     matrix_set_n(&m,2 * A->m);  
  219.     matrix_init(&m);  
  220.     for (i = 0;i < m.m;i++)    
  221.     {    
  222.         for (j = 0;j < m.n;j++)    
  223.         {    
  224.             if (j <= A->n - 1)    
  225.             {    
  226.                 matrix_write(&m,i,j,matrix_read(A,i,j));    
  227.             }    
  228.             else    
  229.             {    
  230.                 if (i == j - A->n)    
  231.                 {    
  232.                     matrix_write(&m,i,j,1);    
  233.                 }    
  234.                 else    
  235.                 {    
  236.                     matrix_write(&m,i,j,0);    
  237.                 }    
  238.             }    
  239.         }    
  240.     }    
  241.         
  242.     //高斯消元     
  243.     //变换下三角     
  244.     for (k = 0;k < m.m - 1;k++)    
  245.     {    
  246.         //如果坐标为k,k的数为0,则行变换     
  247.         if (matrix_read(&m,k,k) == 0)    
  248.         {    
  249.             for (i = k + 1;i < m.m;i++)    
  250.             {    
  251.                 if (matrix_read(&m,i,k) != 0)    
  252.                 {    
  253.                     break;    
  254.                 }    
  255.             }    
  256.             if (i >= m.m)    
  257.             {    
  258.                 return -1;    
  259.             }    
  260.             else    
  261.             {    
  262.                 //交换行     
  263.                 for (j = 0;j < m.n;j++)    
  264.                 {    
  265.                     temp = matrix_read(&m,k,j);    
  266.                     matrix_write(&m,k,j,matrix_read(&m,k + 1,j));    
  267.                     matrix_write(&m,k + 1,j,temp);    
  268.                 }    
  269.             }    
  270.         }    
  271.             
  272.         //消元     
  273.         for (i = k + 1;i < m.m;i++)    
  274.         {    
  275.             //获得倍数     
  276.             b = matrix_read(&m,i,k) / matrix_read(&m,k,k);    
  277.             //行变换     
  278.             for (j = 0;j < m.n;j++)    
  279.             {    
  280.                 temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j);    
  281.                 matrix_write(&m,i,j,temp);    
  282.             }    
  283.         }    
  284.     }    
  285.     //变换上三角     
  286.     for (k = m.m - 1;k > 0;k--)    
  287.     {    
  288.         //如果坐标为k,k的数为0,则行变换     
  289.         if (matrix_read(&m,k,k) == 0)    
  290.         {    
  291.             for (i = k + 1;i < m.m;i++)    
  292.             {    
  293.                 if (matrix_read(&m,i,k) != 0)    
  294.                 {    
  295.                     break;    
  296.                 }    
  297.             }    
  298.             if (i >= m.m)    
  299.             {    
  300.                 return -1;    
  301.             }    
  302.             else    
  303.             {    
  304.                 //交换行     
  305.                 for (j = 0;j < m.n;j++)    
  306.                 {    
  307.                     temp = matrix_read(&m,k,j);    
  308.                     matrix_write(&m,k,j,matrix_read(&m,k + 1,j));    
  309.                     matrix_write(&m,k + 1,j,temp);    
  310.                 }    
  311.             }    
  312.         }    
  313.             
  314.         //消元     
  315.         for (i = k - 1;i >= 0;i--)    
  316.         {    
  317.             //获得倍数     
  318.             b = matrix_read(&m,i,k) / matrix_read(&m,k,k);    
  319.             //行变换     
  320.             for (j = 0;j < m.n;j++)    
  321.             {    
  322.                 temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j);    
  323.                 matrix_write(&m,i,j,temp);    
  324.             }    
  325.         }    
  326.     }    
  327.     //将左边方阵化为单位矩阵     
  328.     for (i = 0;i < m.m;i++)    
  329.     {    
  330.         if (matrix_read(&m,i,i) != 1)    
  331.         {    
  332.             //获得倍数     
  333.             b = 1 / matrix_read(&m,i,i);    
  334.             //行变换     
  335.             for (j = 0;j < m.n;j++)    
  336.             {    
  337.                 temp = matrix_read(&m,i,j) * b;    
  338.                 matrix_write(&m,i,j,temp);    
  339.             }    
  340.         }    
  341.     }    
  342.     //求得逆矩阵     
  343.     for (i = 0;i < B->m;i++)    
  344.     {    
  345.         for (j = 0;j < B->m;j++)    
  346.         {    
  347.             matrix_write(B,i,j,matrix_read(&m,i,j + m.m));    
  348.         }    
  349.     }    
  350.     //释放增广矩阵     
  351.     matrix_free(&m);    
  352.         
  353.     return 1;   
  354. }  
#include "matrix.h"

//矩阵方法
//设置m  
void matrix_set_m(struct _Matrix *m,int mm)
{
	m->m = mm; 
}

//设置n  
void matrix_set_n(struct _Matrix *m,int nn)
{
	m->n = nn;
}

//初始化  
void matrix_init(struct _Matrix *m)
{
	m->arr = (float *)malloc(m->m * m->n * sizeof(float));
}

//释放  
void matrix_free(struct _Matrix *m)
{
	free(m->arr);
}

//读取i,j坐标的数据  
//失败返回-31415,成功返回值  
float matrix_read(struct _Matrix *m,int i,int j)
{
	if (i >= m->m || j >= m->n)  
    {  
        return -31415;  
    }  
      
    return *(m->arr + i * m->n + j);  
}

//写入i,j坐标的数据  
//失败返回-1,成功返回1  
int matrix_write(struct _Matrix *m,int i,int j,float val)
{
	if (i >= m->m || j >= m->n)  
    {  
        return -1;  
    }  
      
    *(m->arr + i * m->n + j) = val;  
    return 1;  
}

//矩阵运算
//成功返回1,失败返回-1  
int matrix_add(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C)
{
	int i = 0;  
    int j = 0;  
      
    //判断是否可以运算  
	if (A->m != B->m || A->n != B->n || \
        A->m != C->m || A->n != C->n)  
    {  
        return -1;  
    }  
    //运算  
    for (i = 0;i < C->m;i++)  
    {  
        for (j = 0;j < C->n;j++)  
        {  
            matrix_write(C,i,j,matrix_read(A,i,j) + matrix_read(B,i,j));  
        }  
    }  
      
    return 1; 
}

//C = A - B  
//成功返回1,失败返回-1  
int matrix_subtract(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C)
{
	int i = 0;  
    int j = 0;  
      
    //判断是否可以运算  
    if (A->m != B->m || A->n != B->n || \
        A->m != C->m || A->n != C->n)  
    {  
        return -1;  
    }  
    //运算  
    for (i = 0;i < C->m;i++)  
    {  
        for (j = 0;j < C->n;j++)  
        {  
            matrix_write(C,i,j,matrix_read(A,i,j) - matrix_read(B,i,j));  
        }  
    }  
      
    return 1; 
}

//C = A * B  
//成功返回1,失败返回-1  
int matrix_multiply(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C)
{
	int i = 0;  
    int j = 0;  
    int k = 0;  
    float temp = 0;  
      
    //判断是否可以运算  
    if (A->m != C->m || B->n != C->n || \
        A->n != B->m)  
    {  
        return -1;  
    }  
    //运算  
    for (i = 0;i < C->m;i++)  
    {  
        for (j = 0;j < C->n;j++)  
        {  
            temp = 0;  
            for (k = 0;k < A->n;k++)  
            {  
                temp += matrix_read(A,i,k) * matrix_read(B,k,j);  
            }  
            matrix_write(C,i,j,temp);  
        }  
    }  
      
    return 1; 
}

//行列式的值,只能计算2 * 2,3 * 3  
//失败返回-31415,成功返回值  
float matrix_det(struct _Matrix *A)
{
	float value = 0;  
      
    //判断是否可以运算  
    if (A->m != A->n || (A->m != 2 && A->m != 3))  
    {  
        return -31415;  
    }  
    //运算  
    if (A->m == 2)  
    {  
        value = matrix_read(A,0,0) * matrix_read(A,1,1) - matrix_read(A,0,1) * matrix_read(A,1,0);  
    }  
    else  
    {  
        value = matrix_read(A,0,0) * matrix_read(A,1,1) * matrix_read(A,2,2) + \
                matrix_read(A,0,1) * matrix_read(A,1,2) * matrix_read(A,2,0) + \
                matrix_read(A,0,2) * matrix_read(A,1,0) * matrix_read(A,2,1) - \
                matrix_read(A,0,0) * matrix_read(A,1,2) * matrix_read(A,2,1) - \
                matrix_read(A,0,1) * matrix_read(A,1,0) * matrix_read(A,2,2) - \
                matrix_read(A,0,2) * matrix_read(A,1,1) * matrix_read(A,2,0);  
    }  
      
    return value; 
}

//求转置矩阵,B = AT  
//成功返回1,失败返回-1  
int matrix_transpos(struct _Matrix *A,struct _Matrix *B)
{
	int i = 0;  
    int j = 0;  
      
    //判断是否可以运算  
    if (A->m != B->n || A->n != B->m)  
    {  
        return -1;  
    }  
    //运算  
    for (i = 0;i < B->m;i++)  
    {  
        for (j = 0;j < B->n;j++)  
        {  
            matrix_write(B,i,j,matrix_read(A,j,i));  
        }  
    }  
      
    return 1;  
}

//求逆矩阵,B = A^(-1)  
//成功返回1,失败返回-1  
int matrix_inverse(struct _Matrix *A,struct _Matrix *B)
{
	int i = 0;  
    int j = 0;  
    int k = 0;  
    struct _Matrix m;  
    float temp = 0;  
    float b = 0;  
      
    //判断是否可以运算  
    if (A->m != A->n || B->m != B->n || A->m != B->m)  
    {  
        return -1;  
    }  
      
    /* 
    //如果是2维或者3维求行列式判断是否可逆 
    if (A->m == 2 || A->m == 3) 
    { 
        if (det(A) == 0) 
        { 
            return -1; 
        } 
    } 
    */  
      
    //增广矩阵m = A | B初始化   
	matrix_set_m(&m,A->m);
	matrix_set_n(&m,2 * A->m);
	matrix_init(&m);
    for (i = 0;i < m.m;i++)  
    {  
        for (j = 0;j < m.n;j++)  
        {  
            if (j <= A->n - 1)  
            {  
                matrix_write(&m,i,j,matrix_read(A,i,j));  
            }  
            else  
            {  
                if (i == j - A->n)  
                {  
                    matrix_write(&m,i,j,1);  
                }  
                else  
                {  
                    matrix_write(&m,i,j,0);  
                }  
            }  
        }  
    }  
      
    //高斯消元  
    //变换下三角  
    for (k = 0;k < m.m - 1;k++)  
    {  
        //如果坐标为k,k的数为0,则行变换  
        if (matrix_read(&m,k,k) == 0)  
        {  
            for (i = k + 1;i < m.m;i++)  
            {  
                if (matrix_read(&m,i,k) != 0)  
                {  
                    break;  
                }  
            }  
            if (i >= m.m)  
            {  
                return -1;  
            }  
            else  
            {  
                //交换行  
                for (j = 0;j < m.n;j++)  
                {  
                    temp = matrix_read(&m,k,j);  
                    matrix_write(&m,k,j,matrix_read(&m,k + 1,j));  
                    matrix_write(&m,k + 1,j,temp);  
                }  
            }  
        }  
          
        //消元  
        for (i = k + 1;i < m.m;i++)  
        {  
            //获得倍数  
            b = matrix_read(&m,i,k) / matrix_read(&m,k,k);  
            //行变换  
            for (j = 0;j < m.n;j++)  
            {  
                temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j);  
                matrix_write(&m,i,j,temp);  
            }  
        }  
    }  
    //变换上三角  
    for (k = m.m - 1;k > 0;k--)  
    {  
        //如果坐标为k,k的数为0,则行变换  
        if (matrix_read(&m,k,k) == 0)  
        {  
            for (i = k + 1;i < m.m;i++)  
            {  
                if (matrix_read(&m,i,k) != 0)  
                {  
                    break;  
                }  
            }  
            if (i >= m.m)  
            {  
                return -1;  
            }  
            else  
            {  
                //交换行  
                for (j = 0;j < m.n;j++)  
                {  
                    temp = matrix_read(&m,k,j);  
                    matrix_write(&m,k,j,matrix_read(&m,k + 1,j));  
                    matrix_write(&m,k + 1,j,temp);  
                }  
            }  
        }  
          
        //消元  
        for (i = k - 1;i >= 0;i--)  
        {  
            //获得倍数  
            b = matrix_read(&m,i,k) / matrix_read(&m,k,k);  
            //行变换  
            for (j = 0;j < m.n;j++)  
            {  
                temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j);  
                matrix_write(&m,i,j,temp);  
            }  
        }  
    }  
    //将左边方阵化为单位矩阵  
    for (i = 0;i < m.m;i++)  
    {  
        if (matrix_read(&m,i,i) != 1)  
        {  
            //获得倍数  
            b = 1 / matrix_read(&m,i,i);  
            //行变换  
            for (j = 0;j < m.n;j++)  
            {  
                temp = matrix_read(&m,i,j) * b;  
                matrix_write(&m,i,j,temp);  
            }  
        }  
    }  
    //求得逆矩阵  
    for (i = 0;i < B->m;i++)  
    {  
        for (j = 0;j < B->m;j++)  
        {  
            matrix_write(B,i,j,matrix_read(&m,i,j + m.m));  
        }  
    }  
    //释放增广矩阵  
    matrix_free(&m);  
      
    return 1; 
}

main.c:(测试代码)

  1. #include <stdio.h>   
  2. #include "matrix.h"   
  3.   
  4. //打印2维矩阵   
  5. void printf_matrix(struct _Matrix *A)  
  6. {  
  7.     int i = 0;  
  8.     int j = 0;  
  9.     int m = 0;  
  10.     int n = 0;  
  11.       
  12.     m = A->m;  
  13.     n = A->n;  
  14.     for (i = 0;i < m;i++)  
  15.     {  
  16.         for (j = 0;j < n;j++)  
  17.         {  
  18.             printf("%f\t",matrix_read(A,i,j));  
  19.         }  
  20.         printf("\n");  
  21.     }  
  22. }  
  23.   
  24. int main()  
  25. {  
  26.     int i = 0;  
  27.     int j = 0;  
  28.     int k = 0;  
  29.     struct _Matrix m1;  
  30.     struct _Matrix m2;  
  31.     struct _Matrix m3;  
  32.       
  33.     //初始化内存   
  34.     matrix_set_m(&m1,3);  
  35.     matrix_set_n(&m1,3);  
  36.     matrix_init(&m1);  
  37.     matrix_set_m(&m2,3);  
  38.     matrix_set_n(&m2,3);  
  39.     matrix_init(&m2);  
  40.     matrix_set_m(&m3,3);  
  41.     matrix_set_n(&m3,3);  
  42.     matrix_init(&m3);  
  43.       
  44.     //初始化数据   
  45.     k = 1;  
  46.     for (i = 0;i < m1.m;i++)  
  47.     {  
  48.         for (j = 0;j < m1.n;j++)  
  49.         {  
  50.             matrix_write(&m1,i,j,k++);  
  51.         }  
  52.     }  
  53.       
  54.     for (i = 0;i < m2.m;i++)  
  55.     {  
  56.         for (j = 0;j < m2.n;j++)  
  57.         {  
  58.             matrix_write(&m2,i,j,k++);  
  59.         }  
  60.     }  
  61.       
  62.     //原数据   
  63.     printf("A:\n");  
  64.     printf_matrix(&m1);  
  65.     printf("B:\n");  
  66.     printf_matrix(&m2);  
  67.       
  68.     printf("A:行列式的值%f\n",matrix_det(&m1));  
  69.       
  70.     //C = A + B   
  71.     if (matrix_add(&m1,&m2,&m3) > 0)  
  72.     {  
  73.         printf("C = A + B:\n");  
  74.         printf_matrix(&m3);  
  75.     }  
  76.       
  77.     //C = A - B   
  78.     if (matrix_subtract(&m1,&m2,&m3) > 0)  
  79.     {  
  80.         printf("C = A - B:\n");  
  81.         printf_matrix(&m3);  
  82.     }  
  83.       
  84.     //C = A * B   
  85.     if (matrix_multiply(&m1,&m2,&m3) > 0)  
  86.     {  
  87.         printf("C = A * B:\n");  
  88.         printf_matrix(&m3);  
  89.     }  
  90.       
  91.     //C = AT   
  92.     if (matrix_transpos(&m1,&m3) > 0)  
  93.     {  
  94.         printf("C = AT:\n");  
  95.         printf_matrix(&m3);  
  96.     }  
  97.       
  98.     if (matrix_inverse(&m1,&m3) > 0)  
  99.     {  
  100.         printf("C = A^(-1):\n");  
  101.         printf_matrix(&m3);  
  102.     }  
  103.       
  104.     getchar();  
  105.     return 0;  
  106. }  

环境:

主机:XP

开发环境:mingw


功能:

在C++中实现矩阵运算


说明:

将这篇文章(http://blog.csdn.net/jdh99/article/details/7360091)中在C++下实现的矩阵运算移植到C

抱歉!评论已关闭.