C#矩阵类运算
来源:互联网 发布:桥接模式下centos联网 编辑:程序博客网 时间:2024/05/21 10:50
/// <summary>
/// 矩阵类
/// </summary>
/// </remarks>
public sealed class Matrix
{
int row, column; //矩阵的行列数
double [,] data; //矩阵的数据
#region 构造函数
public Matrix(int rowNum,int columnNum)
{
row = rowNum;
column = columnNum;
data = new double[row, column];
}
public Matrix(double[,] members)
{
row = members.GetUpperBound(0) + 1;
column = members.GetUpperBound(1) + 1;
data = new double[row, column];
Array.Copy(members, data, row * column);
}
public Matrix(double[] vector)
{
row = 1;
column = vector.GetUpperBound(0)+1;
data = new double[1, column];
for (int i = 0; i < vector.Length; i++)
{
data[0, i] = vector[i];
}
}
#endregion
#region 属性和索引器
public int rowNum { get { return row; } }
public int columnNum { get { return column; } }
public double this [int r,int c]
{
get{ return data[r,c];}
set{data[r,c]=value;}
}
#endregion
#region 转置
/// <summary>
/// 将矩阵转置,得到一个新矩阵(此操作不影响原矩阵)
/// </summary>
/// <param name="input">要转置的矩阵</param>
/// <returns>原矩阵经过转置得到的新矩阵</returns>
public static Matrix transpose(Matrix input)
{
double[,] inverseMatrix = new double[input.column, input.row];
for (int r = 0; r < input.row; r++)
for (int c = 0; c < input.column; c++)
inverseMatrix[c, r] = input[r, c];
return new Matrix(inverseMatrix);
}
#endregion
#region 得到行向量或者列向量
public Matrix getRow(int r)
{
if (r > row || r<=0) throw new MatrixException("没有这一行。");
double[] a = new double[column];
Array.Copy(data, column * (row - 1), a, 0, column);
Matrix m = new Matrix(a);
return m;
}
public Matrix getColumn(int c)
{
if (c > column || c < 0) throw new MatrixException("没有这一列。");
double[,] a = new double[row,1];
for (int i = 0; i < row; i++)
a[i,0] = data[i, c];
return new Matrix(a);
}
#endregion
#region 操作符重载 + - * / == !=
public static Matrix operator +(Matrix a, Matrix b)
{
if (a.row != b.row || a.column != b.column)
throw new MatrixException("矩阵维数不匹配。");
Matrix result = new Matrix(a.row, a.column);
for (int i = 0; i < a.row; i++)
for (int j = 0; j < a.column; j++)
result[i, j] = a[i, j] + b[i, j];
return result;
}
public static Matrix operator -(Matrix a, Matrix b)
{
return a + b * (-1);
}
public static Matrix operator *(Matrix matrix, double factor)
{
Matrix result = new Matrix(matrix.row, matrix.column);
for (int i = 0; i < matrix.row; i++)
for (int j = 0; j < matrix.column; j++)
matrix[i, j] = matrix[i, j] * factor;
return matrix;
}
public static Matrix operator *(double factor,Matrix matrix)
{
return matrix * factor;
}
public static Matrix operator *(Matrix a, Matrix b)
{
if(a.column!=b.row)
throw new MatrixException("矩阵维数不匹配。");
Matrix result = new Matrix(a.row, b.column);
for (int i = 0; i < a.row; i++)
for (int j = 0; j < b.column; j++)
for (int k = 0; k < a.column; k++)
result[i, j] += a[i, k] * b[k, j];
return result;
}
public static bool operator ==(Matrix a, Matrix b)
{
if (object.Equals(a, b)) return true;
if(object.Equals(null,b))
return a.Equals(b);
return b.Equals(a);
}
public static bool operator !=(Matrix a, Matrix b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (!(obj is Matrix)) return false;
Matrix t = obj as Matrix;
if (row != t.row || column != t.column) return false;
return this.Equals(t, 10);
}
/// <summary>
/// 按照给定的精度比较两个矩阵是否相等
/// </summary>
/// <param name="matrix">要比较的另外一个矩阵</param>
/// <param name="precision">比较精度(小数位)</param>
/// <returns>是否相等</returns>
public bool Equals(Matrix matrix, int precision)
{
if (precision < 0) throw new MatrixException("小数位不能是负数");
double test = Math.Pow(10.0, -precision);
if (test<double.Epsilon)
throw new MatrixException("所要求的精度太高,不被支持。");
for (int r = 0; r < this.row; r++)
for (int c = 0; c < this.column; c++)
if (Math.Abs(this[r, c] - matrix[r, c] )>=test)
return false;
return true;
}
#endregion
}
/// 矩阵类
/// </summary>
/// </remarks>
public sealed class Matrix
{
int row, column; //矩阵的行列数
double [,] data; //矩阵的数据
#region 构造函数
public Matrix(int rowNum,int columnNum)
{
row = rowNum;
column = columnNum;
data = new double[row, column];
}
public Matrix(double[,] members)
{
row = members.GetUpperBound(0) + 1;
column = members.GetUpperBound(1) + 1;
data = new double[row, column];
Array.Copy(members, data, row * column);
}
public Matrix(double[] vector)
{
row = 1;
column = vector.GetUpperBound(0)+1;
data = new double[1, column];
for (int i = 0; i < vector.Length; i++)
{
data[0, i] = vector[i];
}
}
#endregion
#region 属性和索引器
public int rowNum { get { return row; } }
public int columnNum { get { return column; } }
public double this [int r,int c]
{
get{ return data[r,c];}
set{data[r,c]=value;}
}
#endregion
#region 转置
/// <summary>
/// 将矩阵转置,得到一个新矩阵(此操作不影响原矩阵)
/// </summary>
/// <param name="input">要转置的矩阵</param>
/// <returns>原矩阵经过转置得到的新矩阵</returns>
public static Matrix transpose(Matrix input)
{
double[,] inverseMatrix = new double[input.column, input.row];
for (int r = 0; r < input.row; r++)
for (int c = 0; c < input.column; c++)
inverseMatrix[c, r] = input[r, c];
return new Matrix(inverseMatrix);
}
#endregion
#region 得到行向量或者列向量
public Matrix getRow(int r)
{
if (r > row || r<=0) throw new MatrixException("没有这一行。");
double[] a = new double[column];
Array.Copy(data, column * (row - 1), a, 0, column);
Matrix m = new Matrix(a);
return m;
}
public Matrix getColumn(int c)
{
if (c > column || c < 0) throw new MatrixException("没有这一列。");
double[,] a = new double[row,1];
for (int i = 0; i < row; i++)
a[i,0] = data[i, c];
return new Matrix(a);
}
#endregion
#region 操作符重载 + - * / == !=
public static Matrix operator +(Matrix a, Matrix b)
{
if (a.row != b.row || a.column != b.column)
throw new MatrixException("矩阵维数不匹配。");
Matrix result = new Matrix(a.row, a.column);
for (int i = 0; i < a.row; i++)
for (int j = 0; j < a.column; j++)
result[i, j] = a[i, j] + b[i, j];
return result;
}
public static Matrix operator -(Matrix a, Matrix b)
{
return a + b * (-1);
}
public static Matrix operator *(Matrix matrix, double factor)
{
Matrix result = new Matrix(matrix.row, matrix.column);
for (int i = 0; i < matrix.row; i++)
for (int j = 0; j < matrix.column; j++)
matrix[i, j] = matrix[i, j] * factor;
return matrix;
}
public static Matrix operator *(double factor,Matrix matrix)
{
return matrix * factor;
}
public static Matrix operator *(Matrix a, Matrix b)
{
if(a.column!=b.row)
throw new MatrixException("矩阵维数不匹配。");
Matrix result = new Matrix(a.row, b.column);
for (int i = 0; i < a.row; i++)
for (int j = 0; j < b.column; j++)
for (int k = 0; k < a.column; k++)
result[i, j] += a[i, k] * b[k, j];
return result;
}
public static bool operator ==(Matrix a, Matrix b)
{
if (object.Equals(a, b)) return true;
if(object.Equals(null,b))
return a.Equals(b);
return b.Equals(a);
}
public static bool operator !=(Matrix a, Matrix b)
{
return !(a == b);
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (!(obj is Matrix)) return false;
Matrix t = obj as Matrix;
if (row != t.row || column != t.column) return false;
return this.Equals(t, 10);
}
/// <summary>
/// 按照给定的精度比较两个矩阵是否相等
/// </summary>
/// <param name="matrix">要比较的另外一个矩阵</param>
/// <param name="precision">比较精度(小数位)</param>
/// <returns>是否相等</returns>
public bool Equals(Matrix matrix, int precision)
{
if (precision < 0) throw new MatrixException("小数位不能是负数");
double test = Math.Pow(10.0, -precision);
if (test<double.Epsilon)
throw new MatrixException("所要求的精度太高,不被支持。");
for (int r = 0; r < this.row; r++)
for (int c = 0; c < this.column; c++)
if (Math.Abs(this[r, c] - matrix[r, c] )>=test)
return false;
return true;
}
#endregion
}
- C#矩阵类运算
- C#矩阵类运算2
- 在C#中实现矩阵运算
- C#矩阵类
- C#的矩阵类
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 矩阵运算
- 直接定位vector中间元素的方法
- 使用libdwraf写的一个读取GCC -g参数编译生成的调试信息的例子
- 利用存储过程往数据库中插入记录
- 网络连接
- 存储过程
- C#矩阵类运算
- Android的底层库libutils介绍
- hdu 3792 Twin Prime Conjecture
- 在虚拟机linux下如何上网
- 基于Video4linux的视频采集,用SDL显示
- sql中的存储过程
- C#图像颜色域判断以及颜色直方图识别方法
- OpenCV 矩阵 到 图像 转换
- UVA11987--Almost Union-Find--带权并查集