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();
}
}
版权声明:本文为huiwuhuiwu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。