我正在尝试编写一个程序,该程序将使用以列主要顺序表示为一维数组的二维数组递归地进行矩阵乘法。这是我现在所拥有的。
这是递归调用的主要方法。
vector<double> recursive_mult(int n, vector<double> A, vector<double> B) {
vector<double> C;
if (n == 1) {
C.push_back(A[0] * B[0]);
} else {
C = equals(C, recursive_mult(n/2, matrix_partitioner(n/2, 0, A), matrix_partitioner(n/2, 0, B))
+ recursive_mult(n/2, matrix_partitioner(n/2, 1, A), matrix_partitioner(n/2, 2, B)));
C = equals(C, recursive_mult(n/2, matrix_partitioner(n/2, 0, A), matrix_partitioner(n/2, 1, B))
+ recursive_mult(n/2, matrix_partitioner(n/2, 1, A), matrix_partitioner(n/2, 3, B)));//1
C = equals(C, recursive_mult(n/2, matrix_partitioner(n/2, 2, A), matrix_partitioner(n/2, 0, B))
+ recursive_mult(n/2, matrix_partitioner(n/2, 3, A), matrix_partitioner(n/2, 2, B)));//2
C = equals(C, recursive_mult(n/2, matrix_partitioner(n/2, 2, A), matrix_partitioner(n/2, 1, B))
+ recursive_mult(n/2, matrix_partitioner(n/2, 3, A), matrix_partitioner(n/2, 3, B)));//3
}
return C;
}
Matrix partitioner 从给定的矩阵中获取一个特定的象限。
vector<double> matrix_partitioner(int n, int section, vector<double> A) {
vector<double> C(n*n);
int start_i, start_j, tmp_j;
if (section == 0) {
start_i = 0;
tmp_j = 0;
}
else if (section == 1) {
start_i = 0;
tmp_j = n;
}
else if (section == 2) {
start_i = n;
tmp_j = 0;
}
else if (section == 3) {
start_i = n;
tmp_j = n;
}
for (int i = 0; i < n; i++) {
start_j = tmp_j;
for (int j = 0; j < n; j++) {
C[i+(j*n)] = A[start_i+(start_j*(n*2))];
start_j++;
}
start_i++;
}
return C;
}
Equals将两个矩阵相加的结果放入C
vector<double> equals(vector<double> A, vector<double> B) {
for (int i = 0; i < B.size(); i++) {
A.push_back(B[i]);
}
return A;
}
我还重载了“+”运算符,以便更轻松地添加矩阵。
这些是我得到的结果(我有迭代方法的结果可以比较,它们都使用相同的打印方法):
Iterative
| 250 260 270 280 |
| 618 644 670 696 |
| 986 1028 1070 1112 |
| 1354 1412 1470 1528 |
Recursive
| 250 270 986 1070 |
| 260 280 1028 1112 |
| 618 670 1354 1470 |
| 644 696 1412 1528 |
显然我的递归结果不正确(或者至少顺序不正确)但我不知道如何修复我的代码以使其正确打印。有人可以帮我修复这段代码吗?
我试过重新排序 equals 语句,但没有成功