问题:我用相同的解决方案重载了运算符*
和*=
,尽管使用运算符*=
似乎并没有改变Matrix的内容,也许我是在声明操作符重载方法不正确。
同时,运算符*
可以正常工作,并且实际上可以乘以Matrix,我已经事先进行了检查。
输出:
3 4 -5
8 0 7
8 9 -4
8 7 7
-6 0 6
2 2 9
3 4 -5
8 0 7
8 9 -4
这是代码本身:
struct WrappedMatrix{
int n;
int ** Matrix;
};
struct WrappedVector{
int n;
int * Vector;
};
WrappedVector linearizedMatrix(WrappedMatrix matrix){
WrappedVector vector;
vector.n = matrix.n * matrix.n;
vector.Vector = new int[vector.n];
for(int i = 0; i < matrix.n; i++){
for(int j = 0; j < matrix.n; j++){
int k = j + (int) (i*sqrt(vector.n));
vector.Vector[k] = matrix.Matrix[i][j];
}
}
return vector;
}
WrappedMatrix normalMatrix(WrappedVector vector){
WrappedMatrix matrix;
matrix.n = sqrt(vector.n);
matrix.Matrix = new int * [matrix.n];
for(int i = 0; i < matrix.n; i++){
matrix.Matrix[i] = new int[matrix.n];
for(int j = 0; j < matrix.n; j++){
int k = j + (int) (i*sqrt(vector.n));
matrix.Matrix[i][j] = vector.Vector[k];
}
}
return matrix;
}
WrappedVector operator*(const WrappedVector& vector1, const WrappedVector& vector2) {
if(vector1.n != vector2.n) {
cout << "Матриці різних розмірів!" << endl;
return vector1;
}
WrappedMatrix matrix1 = normalMatrix(vector1);
WrappedMatrix matrix2 = normalMatrix(vector2);
WrappedMatrix result;
result.n = matrix1.n;
result.Matrix = new int * [result.n];
for(int i = 0; i < result.n; i++){
result.Matrix[i] = new int[result.n];
}
for(int i = 0; i < result.n; i++){
for(int j = 0; j < result.n; j++){
for(int k = 0; k < result.n; k++){
int p1 = matrix1.Matrix[i][k];
int p2 = matrix2.Matrix[k][j];
result.Matrix[i][j] += p1 * p2;
}
}
}
WrappedVector resultV = linearizedMatrix(result);
return resultV;
}
//?
WrappedVector operator*=(const WrappedVector& vector1, const WrappedVector& vector2) {
if(vector1.n != vector2.n) {
cout << "Матриці різних розмірів!" << endl;
return vector1;
}
WrappedMatrix matrix1 = normalMatrix(vector1);
WrappedMatrix matrix2 = normalMatrix(vector2);
WrappedMatrix result;
result.n = matrix1.n;
result.Matrix = new int * [result.n];
for(int i = 0; i < result.n; i++){
result.Matrix[i] = new int[result.n];
}
for(int i = 0; i < result.n; i++){
for(int j = 0; j < result.n; j++){
for(int k = 0; k < result.n; k++){
int p1 = matrix1.Matrix[i][k];
int p2 = matrix2.Matrix[k][j];
result.Matrix[i][j] += p1 * p2;
}
}
}
WrappedVector resultV = linearizedMatrix(result);
return resultV;
}
int main() {
WrappedMatrix matrix;
matrix.n = 3;
matrix.Matrix = new int * [matrix.n];
matrix.Matrix[0] = new int[matrix.n];
matrix.Matrix[1] = new int[matrix.n];
matrix.Matrix[2] = new int[matrix.n];
matrix.Matrix[0][0] = 3;
matrix.Matrix[0][1] = 4;
matrix.Matrix[0][2] = -5;
matrix.Matrix[1][0] = 8;
matrix.Matrix[1][1] = 0;
matrix.Matrix[1][2] = 7;
matrix.Matrix[2][0] = 8;
matrix.Matrix[2][1] = 9;
matrix.Matrix[2][2] = -4;
WrappedVector vector = linearizedMatrix(matrix);
cout << vector << endl;
WrappedMatrix matrix1;
matrix1.n = 3;
matrix1.Matrix = new int * [matrix1.n];
matrix1.Matrix[0] = new int[matrix1.n];
matrix1.Matrix[1] = new int[matrix1.n];
matrix1.Matrix[2] = new int[matrix1.n];
matrix1.Matrix[0][0] = 8;
matrix1.Matrix[0][1] = 7;
matrix1.Matrix[0][2] = 7;
matrix1.Matrix[1][0] = -6;
matrix1.Matrix[1][1] = 0;
matrix1.Matrix[1][2] = 6;
matrix1.Matrix[2][0] = 2;
matrix1.Matrix[2][1] = 2;
matrix1.Matrix[2][2] = 9;
WrappedVector vector1 = linearizedMatrix(matrix1);
cout << vector1 << endl;
vector *= vector1;
cout << vector;
return 0;
}
提前谢谢!
答案 0 :(得分:0)
从技术上讲,这不是一个答案,到目前为止,我只是修改了代码,如果有时间,我会在今晚晚些时候添加到代码上。今天早上我刚刚设法整理好了一些东西,以为您不妨看看一下,以免它只是闲着无事:
class A
class B extends A
// this means: B <: A
val listA: List[A] = List()
val listB: List[B] = List()
// Example 1: List[B] <: List[A]
// Note: Here the List[+T] is our parameter! (Covariance!)
def printListA(list: List[A]): Unit = println(list)
printListA(listA)
printListA(listB)
// Example 2: Function[A, _] <: Function[B, _]
// Note: Here a Function1[-T, +R] is our parameter (Contravariance!)
class C
def fooA(a: A): C = ???
def fooB(b: B): C = ???
listB.map(fooB)
listB.map(fooA)
根据我的收集,这是关于评论的内容。在我看来,使用起来要容易得多,尽管如果需要以某种特定方式制作结构和访问矢量,它可能会是您需要的东西之外的其他东西。
此外,我没有弄清楚您在脑子里想得到什么数学结果,因此我没有在运算符中添加任何内容,如果您正在做的话,我稍后可能会添加一些叉积或点积示例。 / p>