矩阵过载运算符c#

时间:2013-04-12 01:06:08

标签: c# matrix operators overloading

我需要的是在C#中重载Operator +,这样我就可以总结2个矩阵。

我有这个功能:

public int[,] operator+(int[,] matriz1, int[,] matriz2)
    {
        int[,] retorno = new int[4, 4];
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                retorno[i, j] = matriz1[i, j] + matriz2[i, j];
            }
        }
        return retorno;
    }

当我这样做时(WT,W1,W2都是int [4,4]):

WT = W1 + W2;

我收到一条错误消息: operator +不能应用于int []和int []类型的操作数,我做错了什么以及如何解决?

3 个答案:

答案 0 :(得分:6)

嗯,首先,在您尝试使用运算符之前,请尝试仅编译运算符方法。它不会编译,错误消息告诉:

  

错误CS0563:二元运算符的一个参数必须是包含类型

这正是它所说的:如果你写一个类C,你可以为C + <any type>(或<any type> + C)编写一个加法运算符。您无法以某种方式定义不涉及C的运算符。所以,简单地说,因为你不是那个写int[,]类的人,所以你不能为它定义一个运算符。

您最好的选择可能是自己定义一个Matrix课程,然后您可以定义您想要的任何操作员。例如;

public class Matrix
{
    private readonly int[,] _values;

    public int this[int x, int y] {
        get { return _values[x, y]; }
    }

    public Matrix(int[,] values) {
        _values = values;
    }

    public static Matrix operator +(Matrix x, Matrix y) {
        int[,] m0 = x._values;
        int[,] m1 = y._values;
        int[,] newMatrix = /* add m0 and m1 */;
        return new Matrix(newMatrix);
    }
}

答案 1 :(得分:3)

您无法为非自定义类型编写运算符:

  

运算符重载允许为一个或两个操作数是用户定义的类或结构类型的操作指定用户定义的运算符实现。

来源:MSDN

另一种方法是编写扩展方法:

public static class MatrixExtensions {
    public static  int[,] Add(this int[,] matriz1, int[,] matriz2)
    {
        int[,] retorno = new int[4, 4];
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                retorno[i, j] = matriz1[i, j] + matriz2[i, j];
            }
        }
        return retorno;
    }
}

并像这样使用它:

int[,] a = ...
int[,] b = ...
int[,] c = a.Add(b);

答案 2 :(得分:3)

在这种情况下它不起作用,因为必须对它所处理的类进行运算符重载,在这种情况下,你只是为它所包含的任何类重载它。基本上,当您执行W1 + W2时,它会查找为int[,]定义的“+”运算符,该运算符对于该内置类型不存在。

为了让它在您尝试的基础上处理矩阵,您需要创建一个Matrix类(可能在内部将其值存储为您正在执行的2d整数数组),然后重载该班的操作员。