2011-03-01 126 views
2

我创建按照这个算法解决了使用高斯 - 乔丹法线性系统的程序:我的for循环不起作用?

for each row ri of the matrix (i from 1 to n) 
     replace ri with ri/rii 
     for each row rk of the matrix (k!=i) 
       replace rk with rk - rki * ri 

显然,我不这样做是正确的,因为只有该行的第一个元素被除以本身。我还是C新手,所以任何帮助,将不胜感激。谢谢!

for (k = 0; k < n; k++) { 
    for (m = 0; m < n+1; m++) { 
     if (matrix[k][m] < TOLERANCE) { 
      printf("Error, pivot is 0\n"); 
      exit(0); 
     } 
     matrix[k][m] = matrix[k][m]/matrix[k][k]; 
    } 

    for (l = 0; l != k; l++) { 
     printMatrix(n, n+1, matrix); 
     for (o = 0; o < n+1; o++) { 
      matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o]; 
     } 
    } 
} 

还有其他的意见吗?它仍然是不完全正确,我拉我的头发笑

+0

什么是'n'和'm'?只是变量被传递给函数? – 2011-03-01 01:29:52

+0

n是系统中的行数。米是一个计数器。它应该是一个增广矩阵,所以也有n + 1列。 – Manske 2011-03-01 01:31:35

回答

1

此时应更换

for(l = 0; l != k; l++){ 

for(l = 0; l < n; l++){ 
    if (l == k) continue; 

第一个为l达到k就停止,所以只流程行0..k-1。第二个处理行0..n-1除了k行(其适合于你的伪“for each row rk of the matrix (k!=i)”)

另外:

for(m = 0; m < n+1; m++){ 

这意味着你必须有n行的矩阵和n + 1列,这是正确的?如果是这样,就我所能说的,其他一切看起来都很好。

+0

是的,n行和n + 1列 – Manske 2011-03-01 01:34:52

3

首先,内循环中的l != k是继续条件。换句话说,当l等于k时,该循环将退出

这不是它在原始代码中的工作原理。它继续为l的所有其他值。

您可以使用这样的事情,而不是:

for(l = 0; l < n; l++) { 
    if (l != k) { 
     printMatrix(n, n+1, matrix); 
     for (o = 0; o < n+1; o++) { 
      matrix[l][o] = matrix[l][o] - matrix[l][k] * matrix[k][o]; 
     } 
    } 
} 

而且,顺便说一句,你应该尝试从一个字母的变量名,离开尤其l,它可以咬你挺厉害你第一次误将它作为1 :-)

3

你将自己划分matrix[k][k](因此将它设置为1),然后将行的其余部分除以1.使用一个临时变量来存储原来的主键使用matrix[k][k]

编辑:虽然上面的代码中的错误,这可能不会引起你正在经历什么,正如其他人所指出的,你还需要使用continue,而不是终止循环的时候l=k

+1

+1 ...良好的捕获。 – 2011-03-01 03:02:01