Change from: https://blog.csdn.net/jdh99/article/details/7889499
Implementing Matrix Operations in C#
This article blog link: http://blog.csdn.net/jdh99 Author: jdh, reprint please note.
Environmental Science:
Host: XP
Development environment: VS2008
Functions:
Implementing Matrix Operations in C#
Source code:
- 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;
- //Matrix data structure
- //Two-dimensional matrix
- class _Matrix
- {
- public int m;
- public int n;
- public float[] arr;
- //Initialization
- public _Matrix()
- {
- m = 0;
- n = 0;
- }
- public _Matrix(int mm,int nn)
- {
- m = mm;
- n = nn;
- }
- //Set m
- public void set_mn(int mm,int nn)
- {
- m = mm;
- n = nn;
- }
- //Set m
- public void set_m(int mm)
- {
- m = mm;
- }
- //Set n
- public void set_n(int nn)
- {
- n = nn;
- }
- //Initialization
- public void init_matrix()
- {
- arr = new float[m * n];
- }
- //Release
- public void free_matrix()
- {
- //delete [] arr;
- }
- //Read the data of i,j coordinates.
- //Failed return - 31415, successful return value
- public float read(int i,int j)
- {
- if (i >= m || j >= n)
- {
- return -31415;
- }
- //return *(arr + i * n + j);
- return arr[i * n + j];
- }
- //Write data in i,j coordinates.
- //Failed Return - 1, Successful Return 1
- public int write(int i,int j,float val)
- {
- if (i >= m || j >= n)
- {
- return -1;
- }
- arr[i * n + j] = val;
- return 1;
- }
- };
- //Two-Dimensional Operational Class
- class _Matrix_Calc
- {
- //Initialization
- public _Matrix_Calc()
- {
- }
- //C = A + B
- //Successful Return 1, Failed Return - 1
- public int add(ref _Matrix A,ref _Matrix B,ref _Matrix C)
- {
- int i = 0;
- int j = 0;
- //Judging whether it can be operated or not
- if (A.m != B.m || A.n != B.n ||
- A.m != C.m || A.n != C.n)
- {
- return -1;
- }
- //Operation
- 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
- //Successful Return 1, Failed Return - 1
- public int subtract(ref _Matrix A,ref _Matrix B, ref _Matrix C)
- {
- int i = 0;
- int j = 0;
- //Judging whether it can be operated or not
- if (A.m != B.m || A.n != B.n ||
- A.m != C.m || A.n != C.n)
- {
- return -1;
- }
- //Operation
- 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
- //Successful Return 1, Failed Return - 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;
- //Judging whether it can be operated or not
- if (A.m != C.m || B.n != C.n ||
- A.n != B.m)
- {
- return -1;
- }
- //Operation
- 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;
- }
- //The value of determinant can only be calculated as 2*2,3*3.
- //Failed return - 31415, successful return value
- public float det(ref _Matrix A)
- {
- float value = 0;
- //Judging whether it can be operated or not
- if (A.m != A.n || (A.m != 2 && A.m != 3))
- {
- return -31415;
- }
- //Operation
- 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;
- }
- //Find the transpose matrix, B = AT
- //Successful Return 1, Failed Return - 1
- public int transpos(ref _Matrix A,ref _Matrix B)
- {
- int i = 0;
- int j = 0;
- //Judging whether it can be operated or not
- if (A.m != B.n || A.n != B.m)
- {
- return -1;
- }
- //Operation
- for (i = 0;i < B.m;i++)
- {
- for (j = 0;j < B.n;j++)
- {
- B.write(i,j,A.read(j,i));
- }
- }
- return 1;
- }
- //Inverse matrix, B = A^(-1)
- //Successful Return 1, Failed Return - 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;
- //Judging whether it can be operated or not
- if (A.m != A.n || B.m != B.n || A.m != B.m)
- {
- return -1;
- }
- /*
- //If the determinant is found in two or three dimensions, whether it is reversible or not is judged.
- if (A.m == 2 || A.m == 3)
- {
- if (det(A) == 0)
- {
- return -1;
- }
- }
- */
- //Augmented matrix m = A | B initialization
- 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);
- }
- }
- }
- }
- //Gauss elimination
- //Transform lower triangle
- for (k = 0;k < m.m - 1;k++)
- {
- //If the coordinate is K and the number of K is 0, then the row transformation
- 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
- {
- //Exchange line
- 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);
- }
- }
- }
- //Elimination
- for (i = k + 1;i < m.m;i++)
- {
- //Get multiple.
- b = m.read(i,k) / m.read(k,k);
- //Line transformation
- for (j = 0;j < m.n;j++)
- {
- temp = m.read(i,j) - b * m.read(k,j);
- m.write(i,j,temp);
- }
- }
- }
- //Transform upper triangle
- for (k = m.m - 1;k > 0;k–)
- {
- //If the coordinate is K and the number of K is 0, then the row transformation
- 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
- {
- //Exchange line
- 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);
- }
- }
- }
- //Elimination
- for (i = k - 1;i >= 0;i–)
- {
- //Get multiple.
- b = m.read(i,k) / m.read(k,k);
- //Line transformation
- for (j = 0;j < m.n;j++)
- {
- temp = m.read(i,j) - b * m.read(k,j);
- m.write(i,j,temp);
- }
- }
- }
- //The left square matrix is transformed into the unit matrix.
- for (i = 0;i < m.m;i++)
- {
- if (m.read(i,i) != 1)
- {
- //Get multiple.
- b = 1 / m.read(i,i);
- //Line transformation
- for (j = 0;j < m.n;j++)
- {
- temp = m.read(i,j) * b;
- m.write(i,j,temp);
- }
- }
- }
- //Find the inverse matrix.
- for (i = 0;i < B.m;i++)
- {
- for (j = 0;j < B.m;j++)
- {
- B.write(i,j,m.read(i,j + m.m));
- }
- }
- //Release augmentation matrix
- 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);
- //Initialize memory
- m1.init_matrix();
- m2.init_matrix();
- m3.init_matrix();
- //Initialize data
- 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);
- //Time equation
- xkg = xk;
- pkg = pk + q;
- //state equation
- kk = pkg / (pkg + r);
- xk = xkg + kk * (zk - xkg);
- pk = (1 - kk) * pkg;
- //output
- output.Text = Convert.ToString(xk);
- }
- private void textBox1_TextChanged(object sender, EventArgs e)
- {
- }
- * */
- }
- }
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; // Matrix data structure // Two-dimensional matrix class _Matrix { public int m; public int n; public float[] arr; / / initialization public _Matrix() { m = 0; n = 0; } public _Matrix(int mm,int nn) { m = mm; n = nn; } / / set m public void set_mn(int mm,int nn) { m = mm; n = nn; } / / set m public void set_m(int mm) { m = mm; } / / set n public void set_n(int nn) { n = nn; } / / initialization public void init_matrix() { arr = new float[m * n]; } / / release public void free_matrix() { //delete [] arr; } // Read the data of i,j coordinates // Failed return - 31415, successful return value public float read(int i,int j) { if (i >= m || j >= n) { return -31415; } //return *(arr + i * n + j); return arr[i * n + j]; } // Write data in i,j coordinates // Failed return - 1, successful return 1 public int write(int i,int j,float val) { if (i >= m || j >= n) { return -1; } arr[i * n + j] = val; return 1; } }; // Two-Dimensional Operational Class class _Matrix_Calc { / / initialization public _Matrix_Calc() { } //C = A + B // Successful Return 1, Failed Return - 1 public int add(ref _Matrix A,ref _Matrix B,ref _Matrix C) { int i = 0; int j = 0; // Judging whether it can be operated on if (A.m != B.m || A.n != B.n || A.m != C.m || A.n != C.n) { return -1; } / / operation 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 // Successful Return 1, Failed Return - 1 public int subtract(ref _Matrix A,ref _Matrix B, ref _Matrix C) { int i = 0; int j = 0; // Judging whether it can be operated on if (A.m != B.m || A.n != B.n || A.m != C.m || A.n != C.n) { return -1; } / / operation 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 // Successful Return 1, Failed Return - 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; // Judging whether it can be operated on if (A.m != C.m || B.n != C.n || A.n != B.m) { return -1; } / / operation 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; } // The value of determinant can only be calculated as 2*2,3*3 // Failed return - 31415, successful return value public float det(ref _Matrix A) { float value = 0; // Judging whether it can be operated on if (A.m != A.n || (A.m != 2 && A.m != 3)) { return -31415; } / / operation 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; } // Find the transpose matrix, B = AT // Successful Return 1, Failed Return - 1 public int transpos(ref _Matrix A,ref _Matrix B) { int i = 0; int j = 0; // Judging whether it can be operated on if (A.m != B.n || A.n != B.m) { return -1; } / / operation for (i = 0;i < B.m;i++) { for (j = 0;j < B.n;j++) { B.write(i,j,A.read(j,i)); } } return 1; } // Inverse matrix, B = A^(-1) // Successful Return 1, Failed Return - 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; // Judging whether it can be operated on if (A.m != A.n || B.m != B.n || A.m != B.m) { return -1; } /* // If the determinant is 2-D or 3-D, judge whether it is reversible or not if (A.m == 2 || A.m == 3) { if (det(A) == 0) { return -1; } } */ // Initialization of augmented matrix 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); } } } } // Gauss elimination // Transform lower triangle for (k = 0;k < m.m - 1;k++) { // If the coordinate is K and the number of K is 0, then the row transformation 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 { / / exchange line 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); } } } / / elimination for (i = k + 1;i < m.m;i++) { // Get multiple b = m.read(i,k) / m.read(k,k); / / row transformation for (j = 0;j < m.n;j++) { temp = m.read(i,j) - b * m.read(k,j); m.write(i,j,temp); } } } // Transform upper triangle for (k = m.m - 1;k > 0;k--) { // If the coordinate is K and the number of K is 0, then the row transformation 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 { / / exchange line 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); } } } / / elimination for (i = k - 1;i >= 0;i--) { // Get multiple b = m.read(i,k) / m.read(k,k); / / row transformation for (j = 0;j < m.n;j++) { temp = m.read(i,j) - b * m.read(k,j); m.write(i,j,temp); } } } // Converting the left square matrix into the unit matrix for (i = 0;i < m.m;i++) { if (m.read(i,i) != 1) { // Get multiple b = 1 / m.read(i,i); / / row transformation for (j = 0;j < m.n;j++) { temp = m.read(i,j) * b; m.write(i,j,temp); } } } // Finding the Inverse Matrix for (i = 0;i < B.m;i++) { for (j = 0;j < B.m;j++) { B.write(i,j,m.read(i,j + m.m)); } } // Release augmentation matrix 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); // Initialize memory m1.init_matrix(); m2.init_matrix(); m3.init_matrix(); // Initialization data 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); // Time equation xkg = xk; pkg = pk + q; // Equation of State kk = pkg / (pkg + r); xk = xkg + kk * (zk - xkg); pk = (1 - kk) * pkg; / / output output.Text = Convert.ToString(xk); } private void textBox1_TextChanged(object sender, EventArgs e) { } * */ } }