【C#】 4. NumericMatrix类型(包含矩阵运算)
来源:互联网 发布:js根据时间戳获取日期 编辑:程序博客网 时间:2024/06/06 02:53
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace UserDefinedDataEXP{ class NumericMatrix<T>:Matrix<T> { // Constructors public NumericMatrix(): base() { } public NumericMatrix(int rows, int columns): base(rows, columns) { } public NumericMatrix(int rows, int columns, int rowstart, int columnstart) :base(rows, columns, rowstart, columnstart) { } public NumericMatrix(NumericMatrix<T> source): base(source) { } public NumericMatrix(Array<T> array, int rowstart, int columnstart) :base(array, rowstart, columnstart) { } // + 运算符 #region ADD OPERATION //委托BinaryOperatorT<T, T, T> addTT private static BinaryOperatorT<T, T, T> addTT; //矩阵加法实现1:NumericMatrix<T> v1,NumericMatrix<T> v2 public static NumericMatrix<T> operator +(NumericMatrix<T> v1, NumericMatrix<T> v2) { NumericMatrix<T> result = new NumericMatrix<T>(v1.Rows,v1.Columns,v1.MinRowIndex,v1.MinColumnIndex); int rdelta = v2.MinRowIndex - v1.MinRowIndex; int cdelta = v2.MinColumnIndex - v1.MinColumnIndex; if (addTT == null) { addTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Add); } for (int i = v1.MinRowIndex; i <= v1.MaxRowIndex; i++) { for (int j = v1.MinColumnIndex; j <= v1.MaxColumnIndex; j++) { result[i,j] = addTT(v1[i,j], v2[i + rdelta,j+cdelta]); } } return result; } #endregion // * 运算符 #region MULPLICATION OPERATION //委托BinaryOperatorT<T, T, T> mulTT private static BinaryOperatorT<T, T, T> mulTT; //乘法实现1:NumericMatrix<T> v1, T v2 public static NumericMatrix<T> operator *(NumericMatrix<T> v1, T v2) { int rows = v1.MaxRowIndex - v1.MinRowIndex + 1; int cols = v1.MaxColumnIndex - v1.MinColumnIndex + 1; NumericMatrix<T> result = new NumericMatrix<T>(rows, cols, v1.MinRowIndex, v1.MinColumnIndex); if (mulTT == null) { mulTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Multiply); addTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Add); } for (int i = v1.MinRowIndex; i <= v1.MaxRowIndex; i++) { for (int j = v1.MinColumnIndex; j <= v1.MaxColumnIndex; j++) { result[i, j] = mulTT(v1[i, j], v2); } } return result; } //乘法实现2:T v2, NumericMatrix<T> v1 public static NumericMatrix<T> operator *(T v2, NumericMatrix<T> v1) { NumericMatrix<T> result = new NumericMatrix<T>(v1.Rows, v1.Columns, v1.MinRowIndex, v1.MinColumnIndex); if (mulTT == null) { mulTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Multiply); } for (int i = v1.MinRowIndex; i <= v1.MaxRowIndex; i++) { for (int j = v1.MinColumnIndex; j <= v1.MaxColumnIndex; j++) { result[i, j] = mulTT(v1[i, j], v2); } } return result; } //乘法实现3:NumericMatrix<T> v1, Array<T> v2 public static Vector<T> operator *(NumericMatrix<T> v1, Vector<T> v2) { Vector<T> result = new Vector<T>(v2.Length, v2.MinIndex); if (mulTT == null || addTT==null) { mulTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Multiply); addTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Add); //非常重要!定义了TT之间的加法! } int delta = v2.MinIndex - v1.MinRowIndex; for (int i = v1.MinRowIndex; i <= v1.MaxRowIndex; i++) { for (int j = v1.MinColumnIndex; j <= v1.MaxColumnIndex; j++) { result[i + delta] = addTT(result[i+ delta], mulTT(v1[i, j], v2[j + delta])); } } return result; } //乘法实现4:NumericMatrix<T> v1, NumericMatrix<T> v2 public static NumericMatrix<T> operator *(NumericMatrix<T> v1, NumericMatrix<T> v2) { NumericMatrix<T> result = new NumericMatrix<T>(v1.Rows,v2.Columns,v1.MinRowIndex,v2.MinColumnIndex); if (mulTT == null || addTT==null ) { mulTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Multiply); addTT = new BinaryOperatorT<T, T, T>(GenericOperatorFactory<T, T, T, NumericMatrix<T>>.Add); //非常重要!定义了TT之间的加法! } int delta = v2.MinRowIndex- v1.MinColumnIndex; for (int i = v1.MinRowIndex; i <= v1.MaxRowIndex; i++) { for (int j = v2.MinColumnIndex; j <= v2.MaxColumnIndex; j++) { for (int k = v1.MinColumnIndex; k <= v1.MaxColumnIndex; k++) { result[i,j] = addTT(mulTT(v1[i, k], v2[k+delta, j]), result[i,j]); } } } return result; } #endregion }}
</pre><pre name="code" class="csharp">
</pre><pre name="code" class="csharp">
</pre><pre name="code" class="csharp">
class test { static void Main(string[] args) { // Matrices int R = 2; int C = 2; int startRow = 1; int startColumn = 1; NumericMatrix<double> A = new NumericMatrix<double>(R, C, startRow, startColumn); NumericMatrix<double> B = new NumericMatrix<double>(R, C, startRow, startColumn); A.initCells(1.0); A.print(); for (int i = A.MinRowIndex; i <= A.MaxRowIndex; i++) { for (int j = A.MinColumnIndex; j <= A.MaxColumnIndex; j++) { A[i, j] = i * j; B[i, j] = -i * j; } } A.print(); B.print(); Console.WriteLine(); // Interactions with scalars and vectors double factor = 2.0; A = factor * A; Console.WriteLine("Original matrix A"); A.print(); Vector<double> x = new Vector<double>(A.Columns, A.MinColumnIndex); for (int j = x.MinIndex; j <= x.MaxIndex; j++) { x[j] = j; } x.print(); x = A * x; x.print(); NumericMatrix<double> D = new NumericMatrix<double>(R, C, startRow, startColumn); D = 3.0 * A; D.print(); D = A + A; D.print(); D = A * A; D.print(); Console.Read(); } }
0 0
- 【C#】 4. NumericMatrix类型(包含矩阵运算)
- 矩阵运算(C++)
- 矩阵的基本运算(C实现)
- 【C#】 3. Vector数据类型(包含运算符重写)
- c 类型、运算
- C实现矩阵加减乘除运算
- C实现矩阵加减乘除运算
- C语言矩阵运算库大起底
- 第十五周—C语言 项目4 (矩阵运算)
- C语言矩阵运算库(Light Matrix)
- C++:类型转换运算符
- C平台上的矩阵运算工具
- 在C中实现矩阵运算
- 矩阵的基本运算 ------ C 实现
- 在C中实现矩阵运算
- c语言练习题 4-2 矩阵运算
- 第一次讲座盲点整理(C类型与运算)
- C基础:布尔类型(BOOL) 关系运算符 switch
- Unity3D学习笔记之五为Prefab添加材质
- 共享内存原理
- 常见的jsp指令 及指令的属性
- 对所谓下一次互联网泡沫的思考
- 闻道软件简介
- 【C#】 4. NumericMatrix类型(包含矩阵运算)
- 小微型企业信息化神器-启耘Box
- 欢迎使用CSDN-markdown编辑器
- 不错的google搜索地址
- UITabBarController的使用步骤
- 移动共享开发(一)基本配置
- ora-12514
- [VC9]简单的虚拟桌面代码
- 好单位与坏单位