`
ydbc
  • 浏览: 720287 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

在C#中实现矩阵运算

 
阅读更多

在C#中实现矩阵运算


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:XP

开发环境:VS2008


功能:

在C#中实现矩阵运算


源代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

//矩阵数据结构  
//二维矩阵  
class _Matrix  
{   
    public int m;  
    public int n;  
    public float[] arr;
      
    //初始化  
    public _Matrix()
    {
        m = 0;  
        n = 0; 
    }

    public _Matrix(int mm,int nn)
    {
        m = mm;  
        n = nn; 
    }

    //设置m  
    public void set_mn(int mm,int nn)
    {
        m = mm;  
        n = nn; 
    } 


    //设置m  
    public void set_m(int mm)
    {  
        m = mm;  
    } 

    //设置n  
    public void set_n(int nn)
    {  
        n = nn;  
    }
   
    //初始化  
    public void init_matrix()
    {  
        arr = new float[m * n];  
    }  

    //释放  
    public void free_matrix()
    {
        //delete [] arr;
    }  

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

        //return *(arr + i * n + j);
        return arr[i * n + j];
    }  

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

        arr[i * n + j] = val;
        return 1;
    }  
};

//二维运算类  
class _Matrix_Calc  
{   
    //初始化
    public  _Matrix_Calc()
    {

    }

    //C = A + B  
    //成功返回1,失败返回-1  
    public  int add(ref _Matrix A,ref _Matrix B,ref _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++)  
            {  
                C.write(i,j,A.read(i,j) + B.read(i,j));  
            }  
        }  
          
        return 1;  
    }  

    //C = A - B  
    //成功返回1,失败返回-1  
    public  int subtract(ref _Matrix A,ref _Matrix B, ref _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++)  
            {  
                C.write(i,j,A.read(i,j) - B.read(i,j));  
            }  
        }  
          
        return 1;  
    } 

    //C = A * B  
    //成功返回1,失败返回-1  
    public int multiply(ref _Matrix A, ref _Matrix B, ref _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 += A.read(i,k) * B.read(k,j);  
                }  
                C.write(i,j,temp);  
            }  
        }  
          
        return 1;  
    } 

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

    //求转置矩阵,B = AT  
    //成功返回1,失败返回-1  
    public int transpos(ref _Matrix A,ref _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++)  
            {  
                B.write(i,j,A.read(j,i));  
            }  
        }  
          
        return 1;  
    }  

    //求逆矩阵,B = A^(-1)  
    //成功返回1,失败返回-1  
    public int inverse(ref _Matrix A, ref _Matrix B)
    {  
        int i = 0;  
        int j = 0;  
        int k = 0;  
        _Matrix m = new _Matrix(A.m,2 * A.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初始化  
        m.init_matrix();  
        for (i = 0;i < m.m;i++)  
        {  
            for (j = 0;j < m.n;j++)  
            {  
                if (j <= A.n - 1)  
                {  
                    m.write(i,j,A.read(i,j));  
                }  
                else  
                {  
                    if (i == j - A.n)  
                    {  
                        m.write(i,j,1);  
                    }  
                    else  
                    {  
                        m.write(i,j,0);  
                    }  
                }  
            }  
        }  
          
        //高斯消元  
        //变换下三角  
        for (k = 0;k < m.m - 1;k++)  
        {  
            //如果坐标为k,k的数为0,则行变换  
            if (m.read(k,k) == 0)  
            {  
                for (i = k + 1;i < m.m;i++)  
                {  
                    if (m.read(i,k) != 0)  
                    {  
                        break;  
                    }  
                }  
                if (i >= m.m)  
                {  
                    return -1;  
                }  
                else  
                {  
                    //交换行  
                    for (j = 0;j < m.n;j++)  
                    {  
                        temp = m.read(k,j);  
                        m.write(k,j,m.read(k + 1,j));  
                        m.write(k + 1,j,temp);  
                    }  
                }  
            }  
              
            //消元  
            for (i = k + 1;i < m.m;i++)  
            {  
                //获得倍数  
                b = m.read(i,k) / m.read(k,k);  
                //行变换  
                for (j = 0;j < m.n;j++)  
                {  
                    temp = m.read(i,j) - b * m.read(k,j);  
                    m.write(i,j,temp);  
                }  
            }  
        }  
        //变换上三角  
        for (k = m.m - 1;k > 0;k--)  
        {  
            //如果坐标为k,k的数为0,则行变换  
            if (m.read(k,k) == 0)  
            {  
                for (i = k + 1;i < m.m;i++)  
                {  
                    if (m.read(i,k) != 0)  
                    {  
                        break;  
                    }  
                }  
                if (i >= m.m)  
                {  
                    return -1;  
                }  
                else  
                {  
                    //交换行  
                    for (j = 0;j < m.n;j++)  
                    {  
                        temp = m.read(k,j);  
                        m.write(k,j,m.read(k + 1,j));  
                        m.write(k + 1,j,temp);  
                    }  
                }  
            }  
              
            //消元  
            for (i = k - 1;i >= 0;i--)  
            {  
                //获得倍数  
                b = m.read(i,k) / m.read(k,k);  
                //行变换  
                for (j = 0;j < m.n;j++)  
                {  
                    temp = m.read(i,j) - b * m.read(k,j);  
                    m.write(i,j,temp);  
                }  
            }  
        }  
        //将左边方阵化为单位矩阵  
        for (i = 0;i < m.m;i++)  
        {  
            if (m.read(i,i) != 1)  
            {  
                //获得倍数  
                b = 1 / m.read(i,i);  
                //行变换  
                for (j = 0;j < m.n;j++)  
                {  
                    temp = m.read(i,j) * b;  
                    m.write(i,j,temp);  
                }  
            }  
        }  
        //求得逆矩阵  
        for (i = 0;i < B.m;i++)  
        {  
            for (j = 0;j < B.m;j++)  
            {  
                B.write(i,j,m.read(i,j + m.m));  
            }  
        }  
        //释放增广矩阵  
        m.free_matrix();  
          
        return 1;  
    }  
};  

namespace test
{
    public partial class Form1 : Form
    {
        double zk;
        double xkg, pkg, kk, xk, pk, q, r;

        public Form1()
        {
            InitializeComponent();
            xk = 0;
            pk = 0;
            q = 0.00001;
            r = 0.0001;


            int i = 0;
            int j = 0;
            int k = 0;  

            _Matrix_Calc m_c = new _Matrix_Calc();  
            //_Matrix m1 = new _Matrix(3,3);  
            //_Matrix m2 = new _Matrix(3,3);
            //_Matrix m3 = new _Matrix(3,3);

            _Matrix m1 = new _Matrix(2, 2);
            _Matrix m2 = new _Matrix(2, 2);
            _Matrix m3 = new _Matrix(2, 2); 
              
            //初始化内存  
            m1.init_matrix();  
            m2.init_matrix();  
            m3.init_matrix();  
              
            //初始化数据  
            k = 1;  
            for (i = 0;i < m1.m;i++)  
            {  
                for (j = 0;j < m1.n;j++)  
                {  
                    m1.write(i,j,k++);  
                }  
            }  
              
            for (i = 0;i < m2.m;i++)  
            {  
                for (j = 0;j < m2.n;j++)  
                {  
                    m2.write(i,j,k++);  
                }  
            }

            m_c.multiply(ref m1,ref  m2, ref m3);
            //output.Text = Convert.ToString(m3.read(1,1));
            output.Text = Convert.ToString(m_c.det(ref m1));
        }
        /*
        private void button1_Click(object sender, EventArgs e)
        {
            zk = Convert.ToDouble(input.Text);

            //时间方程
            xkg = xk;
            pkg = pk + q;
 
            //状态方程
            kk = pkg / (pkg + r);
            xk = xkg + kk * (zk - xkg);
            pk = (1 - kk) * pkg;

            //输出
            output.Text = Convert.ToString(xk);
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
         * */
    }
}


分享到:
评论

相关推荐

    C#实现矩阵运算大全MatrixCalculate.cs

    该文件中包含了各种数组运算,都是用C#语言编写,有矩阵的转置;求逆矩阵;两个矩阵相乘,相加,相减;构造单位对角矩阵;矩阵否相等;托伯利兹矩阵求逆的埃兰特方法;求行列式值的全选主元高斯消去法;求矩阵秩的...

    C#实现的矩阵运算类源文件

    用C#实现的矩阵类,包含各种类型矩阵的定义,能够实现矩阵的各种运算。

    C# Winform实现矩阵运算

    Winform实现矩阵运算,根据输入的行列数随机生成矩阵,实现加减乘运算,也可更换皮肤

    C#中矩阵运算方法实例分析

    在C#中实现矩阵运算 三、源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using ...

    C#用矩阵运算(实现3x3矩阵求逆)

    代码可以实现以下功能: 1.矩阵加法 2.矩阵减法 3.矩阵乘法 4.矩阵行列式 5.矩阵转置 6.矩阵的伴随矩阵 7.矩阵的逆(只限于3x3) 8.向量的单位化 此代码为本人做3D建模(空间旋转)时用的基础代码

    C#实现矩阵计算类库

    用C#实现的矩阵计算类库,实现矩阵的各种运算,类似MATLAB矩阵运算。包括类库和实例DEMO

    矩阵运算_C#_矩阵_

    用C#实现对矩阵的基本运算,C#窗体实现

    C#实现矩阵运算(包括矩阵的加减乘除转置求逆等)

    C#实现矩阵运算(包括矩阵的加减乘除转置求逆等)

    C# 矩阵运算(实数+复数)

    c#实现实数和复数的常用矩阵运算(矩阵乘、数乘、求逆、卷积、产生服从正态分布的随机数)

    c#j矩阵运算

    c#矩阵运算 简单实现C#矩阵运算 对坐标转换有很大的作用

    矩阵相关运算的C#代码

    C#代码实现的矩阵常用运算,如矩阵的加、减、乘、除、求逆等,以类库的形式给出,方便调用。

    C#实现的矩阵算法(相加,转置,求逆)

    C#实现的矩阵类 功能:可以进行矩阵转置,矩阵相乘,矩阵相加,矩阵求逆。 输入输出: 用户可以输入矩阵值后,可以选择矩阵运算类型,每次运算后都要输出运算后的矩阵。 若有错误,提示错误。

    矩阵基本操作的C#代码实现

    包含MATLAB基本的矩阵运算的C#代码实现,方便实际开发用,如求逆矩阵,矩阵相乘,矩阵乘向量,返回矩阵的某一行,某一列,以及求向量,矩阵范数-2的方法,多提意见,进行改进。

    用C++写的矩阵运算类

    一个整合了矩阵运算的C类,这个是我在网上找到的,拿出来与大家分享。

    Matrix_矩阵类_求伴随矩阵C#_

    用C#实现的矩阵运算,对用伴随矩阵的求逆方法更改为LU分解法求逆矩阵。

    控制台实现C#矩阵乘积

    本程序是在控制台下实现2行3列矩阵与3行4列矩阵的乘法,两矩阵都可自己输入或者直接在代码里定义。

    稀疏矩阵运算器(严版)

    稀疏矩阵运算器(严版) C#实现,可运行。visual stutio team work 编译

    C# 矩阵算法

    C# 矩阵算法 .net 矩阵算法。C#矩阵运算类。实现转置,相乘,相加,求逆。

    C#矩阵类(实现相加,相乘,转置,求逆)

    功能:可以进行矩阵转置,矩阵相乘,矩阵相加,矩阵求逆。 输入输出: 用户可以输入矩阵值后,可以选择矩阵运算类型,每次运算后都要输出运算后的矩阵。 若有错误,提示错误。

Global site tag (gtag.js) - Google Analytics