【问题标题】:How to static override/create operator * in a static class如何在静态类中静态覆盖/创建运算符 *
【发布时间】:2013-07-25 08:35:29
【问题描述】:

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

矩阵产品

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

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

【问题讨论】:

  • 您始终可以定义自己的Matrix 类并为该类型指定运算符。实际上,我认为这里没有其他方法。
  • 但我不想重新发明轮子:(
  • 另外,这不会是Extension Method,因为第一个参数前面没有this。
  • @WiiMaxx 这里没有太多的重新发明,你的Matrix 类可以只包装一个锯齿状数组并公开所需的运算符/方法(例如Transpose)。可以说,它会更干净(语义上),因为锯齿状数组并不一定意味着“矩阵”。
  • @Corak 你是对的 :) 还没有看到它,所以它变得更糟,因为它看起来我也不能在那里使用它 :D

标签: c# operators operator-overloading overriding


【解决方案1】:

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

来自MSDN:

在自定义类上重载运算符需要创建一个方法 在具有正确签名的班级上。方法必须命名 "operator X" 其中 X 是操作员的名称或符号 超载。一元运算符只有一个参数,二元运算符 有两个参数。 在每种情况下,一个参数必须是同一类型 作为声明操作符的类或结构 [...]

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

【讨论】:

  • 真可惜。所以我必须重新发明轮子?我不喜欢那样:(
  • @WiiMaxx:实际上没有什么可重新发明的,您可以编写一个直接接受double[,] 的Matrix 构造函数并将其包装起来。顺便说一句,这就是您的参数类型应该是 - 一个矩形数组,而不是 double[][] 这是一个锯齿状数组。
  • 我需要光速性能,所以它必须是一个锯齿状阵列;)
  • @WiiMaxx:我真的没有关于性能如何受到影响的实践经验,但理论上矩形应该更快(少一个间接),除非你的数组是稀疏的,这看起来不是案例在这里。为什么说锯齿更快?
  • 因为[n,m] 是一个单一的内存空间,其中[n][m] 在n 内存空间中呈锯齿状,因此访问速度更快,您可以在自己的内存空间上对其进行测试或搜索 jagged array vs 2d array 它可以基于矩阵大小和算法将性能提高到 100% 以上
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
相关资源
最近更新 更多