茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    C#中矩陣運(yùn)算方法實(shí)例分析
    來源:易賢網(wǎng) 閱讀:1236 次 日期:2015-04-24 10:30:30
    溫馨提示:易賢網(wǎng)小編為您整理了“C#中矩陣運(yùn)算方法實(shí)例分析”,方便廣大網(wǎng)友查閱!

    C#中矩陣運(yùn)算方法實(shí)例分析

    這篇文章主要介紹了C#中矩陣運(yùn)算方法,實(shí)例分析了通過C#實(shí)現(xiàn)矩陣的初始化、轉(zhuǎn)置矩陣、求逆矩陣等各種常用的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

    本文實(shí)例講述了C#中矩陣運(yùn)算方法。分享給大家供大家參考。具體分析如下:

    一、測試環(huán)境:

    主機(jī):XP

    開發(fā)環(huán)境:VS2008

    二、功能:

    在C#中實(shí)現(xiàn)矩陣運(yùn)算

    三、源代碼:

    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;

    //矩陣數(shù)據(jù)結(jié)構(gòu)

    //二維矩陣

    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;

    }

    //設(shè)置m

    public void set_mn(int mm,int nn)

    {

    m = mm;

    n = nn;

    }

    //設(shè)置m

    public void set_m(int mm)

    {

    m = mm;

    }

    //設(shè)置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坐標(biāo)的數(shù)據(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坐標(biāo)的數(shù)據(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;

    }

    };

    //二維運(yùn)算類

    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;

    //判斷是否可以運(yùn)算

    if (A.m != B.m || A.n != B.n ||

    A.m != C.m || A.n != C.n)

    {

    return -1;

    }

    //運(yùn)算

    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;

    //判斷是否可以運(yùn)算

    if (A.m != B.m || A.n != B.n ||

    A.m != C.m || A.n != C.n)

    {

    return -1;

    }

    //運(yùn)算

    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;

    //判斷是否可以運(yùn)算

    if (A.m != C.m || B.n != C.n ||

    A.n != B.m)

    {

    return -1;

    }

    //運(yùn)算

    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;

    }

    //行列式的值,只能計(jì)算2 * 2,3 * 3

    //失敗返回-31415,成功返回值

    public float det(ref _Matrix A)

    {

    float value = 0;

    //判斷是否可以運(yùn)算

    if (A.m != A.n || (A.m != 2 && A.m != 3))

    {

    return -31415;

    }

    //運(yùn)算

    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;

    }

    //求轉(zhuǎn)置矩陣,B = AT

    //成功返回1,失敗返回-1

    public int transpos(ref _Matrix A,ref _Matrix B)

    {

    int i = 0;

    int j = 0;

    //判斷是否可以運(yùn)算

    if (A.m != B.n || A.n != B.m)

    {

    return -1;

    }

    //運(yùn)算

    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;

    //判斷是否可以運(yùn)算

    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++)

    {

    //如果坐標(biāo)為k,k的數(shù)為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++)

    {

    //獲得倍數(shù)

    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--)

    {

    //如果坐標(biāo)為k,k的數(shù)為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--)

    {

    //獲得倍數(shù)

    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)

    {

    //獲得倍數(shù)

    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);

    //初始化內(nèi)存

    m1.init_matrix();

    m2.init_matrix();

    m3.init_matrix();

    //初始化數(shù)據(jù)

    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);

    //時(shí)間方程

    xkg = xk;

    pkg = pk + q;

    //狀態(tài)方程

    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)

    {

    }

    * */

    }

    }

    希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

    更多信息請查看IT技術(shù)專欄

    更多信息請查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:C#中矩陣運(yùn)算方法實(shí)例分析
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報(bào)班

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)