我正在尝试使用LU分解然后反向替换来求解线性方程组。但是,在编译它时存在一个问题,即:
87:2: error: label ‘a’ used but not defined
你知道这意味着什么吗? 这是我的计划:
#include <stdio.h>
#include <math.h>
#include "nrutil.h"
#include <stdlib.h>
#define TINY 1.0e-20;
void ludcmp(float **a, int n, int *indx, float *d)
{
int i,imax,j,k;
float big,dum,sum,temp;
float *vv;
vv=vector(1,n);
*d=1.0;
for (i=1;i<=n;i++) {
big=0.0;
for (j=1;j<=n;j++)
if ((temp=fabs(a[i][j])) > big) big=temp;
if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
vv[i]=1.0/big;
}
for (j=1;j<=n;j++) {
for (i=1;i<j;i++) {
sum=a[i][j];
for (k=1;k<i;k++) sum -= a[i][k]*a[k][j];
a[i][j]=sum;
}
big=0.0;
for (i=j;i<=n;i++) {
sum=a[i][j];
for (k=1;k<j;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
if ( (dum=vv[i]*fabs(sum)) >= big) {
big=dum;
imax=i;
}
}
if (j != imax) {
for (k=1;k<=n;k++) {
dum=a[imax][k];
a[imax][k]=a[j][k];
a[j][k]=dum;
}
*d = -(*d);
vv[imax]=vv[j];
}
indx[j]=imax;
if (a[j][j] == 0.0) a[j][j]=TINY;
if (j != n) {
dum=1.0/(a[j][j]);
for (i=j+1;i<=n;i++) a[i][j] *= dum;
}
}
free_vector(vv,1,n);
}
#undef TINY
void lubksb(float **a, int n, int *indx, float b[])
{
int i,ii=0,ip,j;
float sum;
for (i=1;i<=n;i++) {
ip=indx[i];
sum=b[ip];
b[ip]=b[i];
if (ii)
for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j];
else if (sum) ii=i;
b[i]=sum;
}
for (i=n;i>=1;i--) {
sum=b[i];
for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j];
b[i]=sum/a[i][i];
}
}
int main(){
float a[3][3], c[3][3], b[3], d;
int indx[3], i, j;
a[1][1]=1.00; a[1][2]=0.80; a[1][3]=0.64;
a[2][1]=1.00; a[2][2]=0.90; a[2][3]=0.81;
a[3][1]=1.00; a[3][2]=1.10; a[3][3]=1.11;
b[0]=erf(0.80);
b[1]=erf(0.90);
b[2]=erf(1.10);
ludcmp(&&a, 3, indx, &d);
lubksb(&&a, 3, indx, b);
for (i=0; i<=3; i++)
printf("%f", b[i]);
return 0;
}
答案 0 :(得分:4)
&&
一元运算符不符合您的想法。它用于'get the address of a label defined in the current function'
ludcmp(&&a, 3, indx, &d);
没有标签a,因此错误。
有关修复,请参阅@ BLUEPIX的答案。你必须改变你的功能的签名。
(请注意,二元运算符a && b
是逻辑'和')
答案 1 :(得分:3)
也许
void ludcmp(float a[3][3], int n, int *indx, float *d)
...
void lubksb(float a[3][3], int n, int *indx, float b[])
...
ludcmp(a, 3, indx, &d);
lubksb(a, 3, indx, b);