C# 矩阵计算
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# 矩阵计算的更多相关文章
- [WebGL入门]十,矩阵计算和外部库
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]
[图解tensorflow源码] 入门准备工作 附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html tensorf ...
- C++ 矩阵计算库 :Eigen库
Eigen http://eigen.tuxfamily.org/index.php?title=Main_Page 下载http://bitbucket.org/eigen/eigen/get/3. ...
- Eigen--简单的C++矩阵计算库
晚上突然想写一段小C++程序,要用到矩阵求逆呀乘法呀之类的,所以找了一下有什么现成的可用的C++矩阵计算相关的库,发现有一大堆,在其中各种各样的配置,感觉比较麻烦.从方便性来说Eigen是最方便的了, ...
- opengles 矩阵计算
总的变换矩阵: matrix = projection * view * model 模型矩阵: modelMatrix=translateMatrix * scaleMatrix * rotateM ...
- Scipy学习笔记 矩阵计算
Scipy学习笔记 非本人原创 原链接 http://blog.sina.com.cn/s/blog_70586e000100moen.html 1.逆矩阵的求解 >>>impor ...
- Numpy中的矩阵计算
矩阵初始化 支持matlab语句初始化,支持narray和array初始化. >>> import numpy as np >>> M = np.matrix(&q ...
- hdu 4920 Matrix multiplication (矩阵计算)
题目链接 题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余. 分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因. #include <iostr ...
- 基于visual Studio2013解决C语言竞赛题之1046矩阵计算
题目 解决代码及点评 /************************************************************************/ /* 46 ...
随机推荐
- 《day15---多线程安全问题_JDK1.5的锁机制》
//15同步问题的分析案例以及解决思路 //两个客户到一个银行去存钱,每个客户一次存100,存3次. //问题,该程序是否有安全问题,如果有,写出分析过程,并定于解决方案. /* 发现运行结果: su ...
- 【转】FFMPEG 库移植到 VC 需要的步骤
原文:http://blog.csdn.net/leixiaohua1020/article/details/12747899 在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷 ...
- 从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看
从决策树学习谈到贝叶斯分类算法.EM.HMM 引言 最近在面试中,除了基础 & 算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全 ...
- BZOJ 1954 The xor-longest Path
问题转化为一些数里面选两个数异或和最大. #include<iostream> #include<cstdio> #include<cstring> #includ ...
- [Java Basics] Stack, Heap, Constructor, I/O, Immutable, ClassLoader
Good about Java: friendly syntax, memory management[GC can collect unreferenced memory resources], o ...
- java作业3
Java字段初始化的规律: 静态初始化生成实例之后(就是new之后)变成你赋给它的值 ,先执行静态初始化,如果没有实例化,按照初始化块和构造方法在程序中出现的顺序执行. 当多个类之间有继承关系时,创建 ...
- JS运动基础(一)
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 触控(Touch) 、 布局(Layout)
1 使用触控实现一个简易的画板 1.1 问题 触控(Touch)是一个UITouch类型的对象,当用户触摸了屏幕上的视图时自动被创建,通常使用触控实现绘图.涂鸦.手写等功能.本案例使用触控实现一个简易 ...
- android webview如何加载asset目录里的页面
在asset里的页面都可以这样获得 file:///android_asset/index.html
- tcpdump抓包规则命令大全
下面的例子全是以抓取eth0接口为例,如果不加”-i eth0”是表示抓取所有的接口包括lo. 1.抓取包含10.10.10.122的数据包 # tcpdump -i eth0 -vnn host 1 ...