private void button3_Click(object sender, EventArgs e)
{
double[] arrDataA = new double[] { , };
double[,] arrDataB = new double[,]{ {,},
{,}
}; Matrix a = new Matrix(arrDataA);
Matrix b = new Matrix(arrDataA);
Matrix c;
c = a + b;
Console.WriteLine("A + B :" + c.ToString());
c = a - b;
Console.WriteLine("A - B :" + c.ToString());
Console.WriteLine("A == B :" + (a == b).ToString());
b = new Matrix(arrDataB);
Console.WriteLine("A == B :" + (a == b).ToString());
c = a * b;
Console.WriteLine("A * B :" + c.ToString());
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ProgressTest
{
/// <summary>
/// 矩阵类
/// </summary>
/// <remarks>
/// 孙继磊,2010-10-18
/// sun.j.l.studio@gmail.com
/// </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() + ;
column = members.GetUpperBound() + ;
data = new double[row, column];
Array.Copy(members, data, row * column);
}
public Matrix(double[] vector)
{
row = ;
column = vector.GetUpperBound() + ;
data = new double[, column];
for (int i = ; i < vector.Length; i++)
{
data[, 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 public override string ToString()
{
string strRet = "";
for(int i=;i<row;i++)
for (int j = ; j < column; j++)
{
strRet += data[i,j] + " , ";
}
return strRet;
}
#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 = ; r < input.row; r++)
for (int c = ; 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 <= ) throw new Exception("没有这一行。");
double[] a = new double[column];
Array.Copy(data, column * (row - ), a, , column);
Matrix m = new Matrix(a);
return m;
}
public Matrix getColumn(int c)
{
if (c > column || c < ) throw new Exception("没有这一列。");
double[,] a = new double[row, ];
for (int i = ; i < row; i++)
a[i, ] = 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 Exception("矩阵维数不匹配。");
Matrix result = new Matrix(a.row, a.column);
for (int i = ; i < a.row; i++)
for (int j = ; 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 * (-);
} public static Matrix operator *(Matrix matrix, double factor)
{
Matrix result = new Matrix(matrix.row, matrix.column);
for (int i = ; i < matrix.row; i++)
for (int j = ; j < matrix.column; j++)
matrix[i, j] = matrix[i, j] * factor;
return matrix;
}
public static Matrix operator *(double factor, Matrix matrix)
{
return matrix * factor;
} //a 行元素 * b 列元素
//a 列数 == b行数
public static Matrix operator *(Matrix a, Matrix b)
{
if (a.column != b.row)
throw new Exception("矩阵维数不匹配。");
Matrix result = new Matrix(a.row, b.column);
for (int i = ; i < a.row; i++)
for (int j = ; j < b.column; j++)
for (int k = ; 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, );
}
/// <summary>
/// 按照给定的精度比较两个矩阵是否相等
/// </summary>
/// <param name="matrix">要比较的另外一个矩阵</param>
/// <param name="precision">比较精度(小数位)</param>
/// <returns>是否相等</returns>
public bool Equals(Matrix matrix, int precision)
{
if (precision < ) throw new Exception("小数位不能是负数");
double test = Math.Pow(10.0, -precision);
if (test < double.Epsilon)
throw new Exception("所要求的精度太高,不被支持。");
for (int r = ; r < this.row; r++)
for (int c = ; c < this.column; c++)
if (Math.Abs(this[r, c] - matrix[r, c]) >= test)
return false; return true;
}
#endregion
}
}

C# 矩阵计算的更多相关文章

  1. [WebGL入门]十,矩阵计算和外部库

    注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...

  2. [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

    [图解tensorflow源码] 入门准备工作 附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html  tensorf ...

  3. C++ 矩阵计算库 :Eigen库

    Eigen http://eigen.tuxfamily.org/index.php?title=Main_Page 下载http://bitbucket.org/eigen/eigen/get/3. ...

  4. Eigen--简单的C++矩阵计算库

    晚上突然想写一段小C++程序,要用到矩阵求逆呀乘法呀之类的,所以找了一下有什么现成的可用的C++矩阵计算相关的库,发现有一大堆,在其中各种各样的配置,感觉比较麻烦.从方便性来说Eigen是最方便的了, ...

  5. opengles 矩阵计算

    总的变换矩阵: matrix = projection * view * model 模型矩阵: modelMatrix=translateMatrix * scaleMatrix * rotateM ...

  6. Scipy学习笔记 矩阵计算

    Scipy学习笔记 非本人原创  原链接 http://blog.sina.com.cn/s/blog_70586e000100moen.html 1.逆矩阵的求解 >>>impor ...

  7. Numpy中的矩阵计算

    矩阵初始化 支持matlab语句初始化,支持narray和array初始化. >>> import numpy as np >>> M = np.matrix(&q ...

  8. hdu 4920 Matrix multiplication (矩阵计算)

    题目链接 题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余. 分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因. #include <iostr ...

  9. 基于visual Studio2013解决C语言竞赛题之1046矩阵计算

       题目 解决代码及点评 /************************************************************************/ /* 46 ...

随机推荐

  1. HTML--9表单和验证事件

    1.表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电话号码, ...

  2. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  3. sqlserver定时备份

    前言:给客户部署好系统以后,如果不加一个定时备份,总感觉心里不放心,所以一定要做定时备份,并且定时备份是很简单的 新建作业--基本信息 新建步骤 ) ),) print @filename , NOF ...

  4. poj2193

    //Accepted 368K 532MS //线性dp //dp[i][j]表示前i位最后一个是j的排列数 //dp[i][j]=sum(dp[i-1][h]) h*2<=j #include ...

  5. (转) mysql的连接,创建账号,修改密码

    原文:http://blog.chinaunix.net/uid-20749043-id-1878306.html  mysql的连接,创建账号,修改密码 2008-10-13 15:31:29 分类 ...

  6. php大力力 [021节]mysql表名在mac下不能大写

    2015-08-27 php大力力021.mysql表名在mac下不能大写 刚才数据库里面,phpMyAdmin狂出错. Some errors have been detected on the s ...

  7. 【Leetcode】 LRU Cache实现

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  8. 算法题----称硬币: 2n(并不要求n是2的幂次方)个硬币,有两个硬币重量为m+1, m-1, 其余都是m 分治 O(lgn)找出假币

    Description: 有2n个硬币和一个天平,其中有一个质量是m+1, 另一个硬币质量为m-1, 其余的硬币质量都是m. 要求:O(lgn)时间找出两枚假币 注意: n不一定是2的幂次方 算法1: ...

  9. PHP实现简单计算器

    <!--简单的计算器--> <!DOCTYPE html> <html> <head> <title>PHP实现简单计算器</titl ...

  10. CoreData的使用入门到精通

    源码下载地址: http://download.csdn.net/download/huntaiji/6664567 一,创建项目文件--选择Empty Application  起名:CoreDat ...