【发布时间】:2013-03-05 07:10:56
【问题描述】:
我正在实施Strassen's matrix multiplication algorithm 作为作业的一部分。我已经正确编码,但我不知道为什么它会给出分段错误。 我在 main 中将 strassen() 称为 strassen(0,n,0,n);。 n 是用户给定的数字,它是 2 的幂,它是矩阵(2D 数组)的最大尺寸。 对于 n = 4,它没有给出段错误,但对于 n = 8、16、32,它给出了段错误。 代码如下。
void strassen(int p, int q, int r, int s)
{
int p1,p2,p3,p4,p5,p6,p7;
if(((q-p) == 2)&&((s-r) == 2))
{
p1 = ((a[p][r] + a[p+1][r+1])*(b[p][r] + b[p+1][r+1]));
p2 = ((a[p+1][r] + a[p+1][r+1])*b[p][r]);
p3 = (a[p][r]*(b[p][r+1] - b[p+1][r+1]));
p4 = (a[p+1][r+1]*(b[p+1][r] - b[p][r]));
p5 = ((a[p][r] + a[p][r+1])*b[p+1][r+1]);
p6 = ((a[p+1][r] - a[p][r])*(b[p][r] +b[p][r+1]));
p7 = ((a[p][r+1] - a[p+1][r+1])*(b[p+1][r] + b[p+1][r+1]));
c[p][r] = p1 + p4 - p5 + p7;
c[p][r+1] = p3 + p5;
c[p+1][r] = p2 + p4;
c[p+1][r+1] = p1 + p3 - p2 + p6;
}
else
{
strassen(p, q/2, r, s/2);
strassen(p, q/2, s/2, s);
strassen(q/2, q, r, s/2);
strassen(q/2, q, s/2, s);
}
}
【问题讨论】:
-
很可能终止条件不正确,并且函数递归直到溢出堆栈。您至少应该检查在调试器中运行时会发生什么。如果调试器在
c数组的其中一个分配处停止,请检查索引以确保它们没有超出范围。 -
不要让我们猜测。段错误、堆栈溢出或超出数组边界的原因是什么?在 gdb 中敲击它并提供更多信息。
-
您也可以尝试将
int声明放在第一个if中。虽然我认为约阿希姆是正确的。您确定条件是==而不是<=?假设p和q是 10 和 10。那么我们有 (10,10) (10,5) (10,2) (10,1) (10,0) ... -
我将首先删除不需要的括号并在运算符周围添加一些空格。如果
if(q-p < 2 && s-r < 2)应该停止,则递归不会停止。 -
a、b和c来自哪里?我猜它们是全局变量,参数是数组维度。请考虑编辑您的问题以澄清这一点。不是每个人都熟悉 Strassen 的矩阵乘法算法。提供链接会很有帮助。
标签: c segmentation-fault