我正在研究一个矩阵库作为学习项目,并且这样做我已经重载了*运算符来执行矩阵乘法。我也重载了它来处理标量乘法(将矩阵的每个元素乘以一倍)。我的问题是,当运行以下代码时,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;
}
答案 0 :(得分:5)
您不应该使用代码修改现有矩阵。签名尖叫它正在创建一个 new Matrix
并将其返回。
我不认为您的复制方法/构造函数是什么,但不将m1
分配给ret
;您应该制作m1
的副本,修改副本,然后返回副本,留下m1
< EM>不变
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;
}
答案 1 :(得分: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