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. 使用isEqual来比较对象

    比较对象 您可以使用 isEqual: 方法比较两个对象.让接收消息的对象与传入的对象进行比较:如果相同,该方法返回 YES.例如: BOOL objectsAreEqual = [obj1 isEq ...

  2. Tips about Object-oriented programming

    1, Return subinterface For example, we have a parent interface: public interface A<T extends A< ...

  3. Qt 中使用vector

    新建Empty qmake project,包含如下两个文件: .pro文件 SOURCES += \ main.cpp QT += core CONFIG += c++11 // 支持C++11 . ...

  4. Java 集合深入理解(7):ArrayList

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ArrayList 是 Java 集合 ...

  5. 服务器的Arch Linux,CentOS的,Debian的,Fedora的,Gentoo的,openSUSE的,Slackware的,和Ubuntu哪个好

    我能够建议的就是:如果你自己是开发者,如果你自己买了一台 VPS 自己搭服务器用.选 Ubuntu/Debian 挺好.当然如果你觉得自己闲工夫实在多得没处花,可以隔三差五的就到服务器上做升级更新,用 ...

  6. 贝努利概率 matlab

    参考:http://zhidao.baidu.com/link?url=3XZm35XpFf_kbADwDHEERtgFMKqHftiS5SyTCWcBtlF7B7zeNgoNqIzXxpJsHtBI ...

  7. Hadoop no.1

    解决的问题: 1. 磁盘读取速度慢:磁盘容量大了,将一个大的文件存在磁盘上,但读取速度慢.    解决方法:hdfs将文件拆开存在不同的节点(datanode)上,namenode记载文件存储的位置( ...

  8. 参数化SQL sql语句

    在日常的数据插入时,需要避免数据脚本注入攻击,所以进行参数化SQL很有必要. --说明参数 ) --参数赋值 ' --数据插入 ,'A')

  9. Mysql Too Many Connections问题解决

    MySQL的max_connections参数用来设置最大连接(用户)数.每个连接MySQL的用户均算作一个连接,max_connections的默认值为100.本文将讲解此参数的详细作用与性能影响. ...

  10. Linux启动Apache支持.htaccess伪静态文件方法

    第一.编辑httpd.conf文件 A - 在etc/httpd/conf/目录下的httpd.conf 文件,找到: LoadModule rewrite_module modules/mod_re ...