0

嗨,我想为数组操作编写一些扩展,例如:

矩阵产品

public static double[][] operator *(double[][] matrixA, double[][] matrixB)

矩阵向量积

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;
    }
}

一个异常告诉我我不能将静态类和用户定义的运算符结合起来,所以有解决方法吗?

4

1 回答 1

3

operator *如果它的操作数之一是用户定义的类型,则只能重载,所以很遗憾答案是否定的。

来自MSDN

要在自定义类上重载运算符,需要在具有正确签名的类上创建一个方法。该方法必须命名为“运算符 X”,其中 X 是被重载的运算符的名称或符号。一元运算符有一个参数,二元运算符有两个参数。在每种情况下,一个参数必须与声明运算符的类或结构的类型相同[...]

因此,您被迫要么Matrix在表达式中包含自定义类,要么使用带double[]参数的适当方法。

于 2013-07-25T08:38:54.443 回答