2

我正在开发一个矩阵库作为一个学习项目,在这样做的过程中,我重载了 * 运算符来执行矩阵乘法。我还重载了它来处理标量乘法(将矩阵的每个元素乘以双精度)。我的问题是,当运行以下代码时, test2 和 test 都被修改了,这是不希望的。

Matrix test2 = 2 * test;

我确信这是一个问题,因为 Matrix 是一个类,因此通过引用传递,但没有将 Matrix 更改为结构(我认为这不合适,并且尝试时似乎不工作),我看不到任何解决此问题的方法。我将如何解决这个问题?

实际的操作员代码是

public static Matrix operator *(Matrix m1, double c)
{
   Matrix ret = m1;

   for (long i = 0; i < ret.Width; i++) // Iterate over the rows.
    {
        for (long p = 0; p < ret.Height; p++) // Iterate over the columns.
        {
            ret[i, p] *= c;
        }
    }

   return ret;
}
4

2 回答 2

6

您不应该使用您的代码修改现有矩阵。签名尖叫着它正在创建一个 Matrix的并返回它。

我不确定您的复制方法/构造函数是什么,但不要分配m1ret; 您应该制作副本m1修改副本,然后返回副本,保持m1 不变

public static Matrix operator *(Matrix m1, double c)
{
    Matrix ret = m1.Clone(); //not sure what your "copy" method is

    //do the multiplication on ret

    return ret;
}
于 2013-07-22T12:46:01.160 回答
1

由于Matrix是引用类型,ret = m1因此不会复制您的输入参数并且您最终会对其进行修改。

解决此问题的正确方法是对其进行深层复制m1并进行修改。就像是:

Matrix ret = m1.MakeCopy(); // you need to define this

// and now you are free to modify ret as much as you like
于 2013-07-22T12:46:31.133 回答