您好我想为Array操作编写一些扩展名,如:
MatrixProduct
public static double[][] operator *(double[][] matrixA, double[][] matrixB)
MatrixVectorProduct
public static double[] operator *(double[][] matrix, double[] vector)
还有一些
为什么我要这个?因为你可能知道目前在c#中没有实现这样的操作,如果我可以说matrixC = matrixA * matrixB;
matrixC = MatrixProduct(matrixA,matrixB);
public static class ArrayExtension
{
public static double[] operator *(double[][] matrix, double[] vector)
{
// result of multiplying an n x m matrix by a m x 1 column vector (yielding an n x 1 column vector)
int mRows = matrix.Length; int mCols = matrix[0].Length;
int vRows = vector.Length;
if (mCols != vRows)
throw new InvalidOperationException("Non-conformable matrix and vector in MatrixVectorProduct");
double[] result = new double[mRows]; // an n x m matrix times a m x 1 column vector is a n x 1 column vector
Parallel.For(0, mRows, i =>
{
var row = matrix[i];
for (int j = 0; j < mCols; ++j)
result[i] += row[j] * vector[j];
});
return result;
}
}
,那么感觉更自然吗?有没有办法做到这一点?
因为如果我这样做:
{{1}}
异常告诉我,我无法组合静态类和用户定义的运算符,所以有解决方法吗?
答案 0 :(得分:3)
如果其中一个操作数是用户定义的类型,则只能重载operator *
,所以不幸的是答案是否定的。
来自MSDN:
要使自定义类上的运算符重载,需要创建方法 在具有正确签名的班级上。必须命名该方法 “运算符X”,其中X是运算符的名称或符号 超载。一元运算符有一个参数和二元运算符 有两个参数。 在每种情况下,一个参数必须是相同的类型 作为声明运算符的类或结构 [...]
因此,您不得不在表达式中涉及自定义Matrix
类,或使用带有double[]
参数的正确方法。