我正在尝试在C ++(O(logn))中实现对矩阵应用幂运算的快速方法。因此,我可以定义乘法和幂运算,如下所示
int ** matrixmul(int ** A, int ** B, int n) {
int ** result = (int **) calloc(sizeof(int *), n);
for (int i = 0; i < n; ++i)
result[i] = (int *) calloc(sizeof(int), n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
int sum = 0;
for (int k = 0; k < n; ++k) {
sum += A[i][k] * B[k][j];
}
result[i][j] = sum;
}
}
return result;
}
int ** matrixpow(int ** m, int n, int p) {
if (p == 1) {
return m;
} else if (p % 2 == 0) {
return matrixmul(matrixpow(m, n, p / 2), matrixpow(m, n, p / 2), n);
} else {
return matrixmul(matrixmul(matrixpow(m, n, (p - 1) / 2), matrixpow(m, n, (p - 1) / 2), n), m, n);
}
}
matrixmul函数不是矩阵的通用乘法,它只适用于平方乘法。
我的问题是,是否有一种修改这些函数的方法,所以我不会有任何内存泄漏,因为程序在每次递归调用时都会丢失内存
答案 0 :(得分:4)
用向量替换**,避免使用calloc,malloc,new和delete。
std::vector< std::vector<int> > result = ....
这将消除内存管理问题,您可以在C ++ 11中按值返回向量。
typedef std::vector< std::vector<int> > Matrix;
Matrix matrixmul(const Matrix& A, const Matrix& B, int n) {
Matrix result(n);
for (int i = 0; i < n; ++i)
result[i] = std::vector<int>(n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
int sum = 0;
for (int k = 0; k < n; ++k) {
sum += A[i][k] * B[k][j];
}
result[i][j] = sum;
}
}
return result;
}
答案 1 :(得分:1)
如果由于某种原因想要继续使用int**
,还可以在将结果返回到matrixmult之前释放A和B,从而使程序正常处理。这些变量很可能是一旦完成矩阵结构就会泄露的变量,你将失去再次引用它们的能力。你可以很容易地释放这个内存,因为整个代码中的所有内容都是n:
for( int i = 0 ; i < n ; i++ ) {
for( int j = 0 ; j < n ; j++ ) {
free(A[i][j]);
free(B[i][j]);
}
free(A[i]);
free(B[i]);
}
这行代码似乎很奇怪:
int ** result = (int **) calloc(sizeof(int *), n);
calloc的第一个参数应该是你想要的元素数量,第二个应该是size。我相信它应该是
int ** result = (int **) calloc(n, sizeof(int *));