网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 C#中矩阵运算方法实例分析
内容
    C#中矩阵运算方法实例分析
    这篇文章主要介绍了C#中矩阵运算方法,实例分析了通过C#实现矩阵的初始化、转置矩阵、求逆矩阵等各种常用的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    本文实例讲述了C#中矩阵运算方法。分享给大家供大家参考。具体分析如下:
    一、测试环境:
    主机: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#程序设计有所帮助。
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/15 12:09:42