class Matrix
{
private int numColumns = 0;//矩陣列數
private int numRows = 0;//矩陣行數
private double eps = 0.0;//預設精度
private double[] elements = null;//矩陣資料緩沖區
public int Columns
{
get
{
return numColumns;
}
}
public int Rows
{
get
{
return numRows;
}
}
public double Eps
{
get
{
return eps;
}
set
{
eps = value;
}
}
public double this[int row, int col] //索引器
{
get
{
return elements[col + row * numColumns];
}
set
{
elements[col + row * numColumns] = value;
}
}
public Matrix()
{
}
public bool Init(int nRows, int nCols) //分配記憶體
{
numRows = nRows;
numColumns = nCols;
int nSize = nRows * nCols;
if (nSize < 0)
return false;
else
{
elements = new double[nSize];
return true;
}
}
public Matrix(int row, int col, string[] str)
{
if (row * col != str.Length) return;
this.numRows = row;
this.numColumns = col;
elements = new double[row * col];
for (int i = 0; i < row * col; i++)
{
elements[i] = double.Parse(str[i]);
}
}
public Matrix(double[,] m)
{
this.numRows = m.GetLength(0);
this.numColumns = m.GetLength(1);
elements = new double[numRows * numColumns];
int count = 0;
for (int i = 0; i < numRows; i++)
{
for (int j = 0; j < numColumns; j++)
{
elements[count++] = m[i, j];
}
}
}
public static Matrix operator +(Matrix a, Matrix b) //矩陣加法
{
if (a.numColumns != b.numColumns || a.numRows != b.numRows)
{
throw new Exception("矩陣的行/列數不匹配!");
}
else
{
double[,] res = new double[a.numRows, a.Rows];
for (int i = 0; i < a.numRows; i++)
{
for (int j = 0; j < a.numColumns; j++)
{
res[i, j] = a[i, j] + b[i, j];
}
}
return new Matrix(res);
}
}
public static Matrix operator -(Matrix a, Matrix b) //矩陣減法
{
if (a.numColumns != b.numColumns || a.numRows != b.numRows)
{
throw new Exception("矩陣的行/列數不匹配!");
}
else
{
double[,] res = new double[a.numRows, a.Rows];
for (int i = 0; i < a.numRows; i++)
{
for (int j = 0; j < a.numColumns; j++)
{
res[i, j] = a[i, j] - b[i, j];
}
}
return new Matrix(res);
}
}
public static Matrix Multiply(double a, Matrix A) //矩陣數乘
{
double[,] res = new double[A.numRows, A.numColumns];
for (int i = 0; i < A.numRows; i++)
{
for (int j = 0; j < A.numColumns; j++)
{
res[i, j] = a * A[i, j];
}
}
return new Matrix(res);
}
public static Matrix Multiply(Matrix A, Matrix B) //矩陣乘法
{
if (A.numColumns != B.numRows)
{
throw new Exception("矩陣的行/列數不匹配!");
}
else
{
double[,] res = new double[A.numRows, B.numColumns];
double value;
for (int i = 0; i < A.numRows; i++)
{
for (int j = 0; j < B.numColumns; j++)
{
value = 0.0;
for (int k = 0; k < B.numRows; k++)
{
value = value + A[i, k] * B[k, j];
}
res[i, j] = value;
}
}
return new Matrix(res);
}
}
public static Matrix Transpose(Matrix A) //矩陣的轉置
{
double[,] res = new double[A.numColumns, A.numRows];
for (int i = 0; i < A.numColumns; i++)
{
for (int j = 0; j < A.numRows; j++)
{
res[i, j] = A[j, i];
}
}
return new Matrix(res);
}
public static bool InvertGaussJordan(Matrix A) //矩陣求逆
{
int i, j, k, l, u, v;
double d = 0, p = 0;
// 分配記憶體
int[] pnRow = new int[A.numColumns];
int[] pnCol = new int[A.numColumns];
//消元
for (k = 0; k <= A.numColumns - 1; k++)
{
d = 0.0;
for (i = k; i <= A.numColumns - 1; i++)
{
for (j = k; j <= A.numColumns - 1; j++)
{
l = i * A.numColumns + j;
p = Math.Abs(A.elements[l]);
if (p > d)
{
d = p;
pnRow[k] = i;
pnCol[k] = j;
}
}
}
//失敗
if (d == 0.0)
{
return false;
}
if (pnRow[k] != k)
{
for (j = 0; j <= A.numColumns - 1; j++)
{
u = k * A.numColumns + j;
v = pnRow[k] * A.numColumns + j;
p = A.elements[u];
A.elements[u] = A.elements[v];
A.elements[v] = p;
}
}
if (pnCol[k] != k)
{
for (i = 0; i <= A.numColumns - 1; i++)
{
u = i * A.numColumns + k;
v = i * A.numColumns + pnCol[k];
p = A.elements[u];
A.elements[u] = A.elements[v];
A.elements[v] = p;
}
}
l = k * A.numColumns + k;
A.elements[l] = 1.0 / A.elements[l];
for (j = 0; j <= A.numColumns - 1; j++)
{
if (j != k)
{
u = k * A.numColumns + j;
A.elements[u] = A.elements[u] * A.elements[l];
}
}
for (i = 0; i <= A.numColumns - 1; i++)
{
if (i != k)
{
for (j = 0; j <= A.numColumns - 1; j++)
{
if (j != k)
{
u = i * A.numColumns + j;
A.elements[u] = A.elements[u] - A.elements[i * A.numColumns + k] * A.elements[k * A.numColumns + j];
}
}
}
}
for (i = 0; i <= A.numColumns - 1; i++)
{
if (i != k)
{
u = i * A.numColumns + k;
A.elements[u] = -A.elements[u] * A.elements[l];
}
}
}
//調整恢復行列次序
for (k = A.numColumns - 1; k >= 0; k--)
{
if (pnCol[k] != k)
{
for (j = 0; j <= A.numColumns - 1; j++)
{
u = k * A.numColumns + j;
v = pnCol[k] * A.numColumns + j;
p = A.elements[u];
A.elements[u] = A.elements[v];
A.elements[v] = p;
}
}
if (pnRow[k] != k)
{
for (i = 0; i <= A.numColumns - 1; i++)
{
u = i * A.numColumns + k;
v = i * A.numColumns + pnRow[k];
p = A.elements[u];
A.elements[u] = A.elements[v];
A.elements[v] = p;
}
}
}
return true;
}
}
視窗大概長這樣
uj5u.com熱心網友回復:
看不懂,,這么高級
uj5u.com熱心網友回復:
簡化一下??那就怎么把richtextbox里的陣列一個一個讀出來放到我自己的陣列里uj5u.com熱心網友回復:
啥意思,矩陣相加是要算什么?uj5u.com熱心網友回復:
就把兩個矩陣加起來uj5u.com熱心網友回復:
我現在不會的就是怎么把視窗控制元件里的陣列放到程式里面去轉載請註明出處,本文鏈接:https://www.uj5u.com/net/106078.html
標籤:C#
