49 return sqrt( v[0]*v[0]+v[1]*v[1]+v[2]*v[2] );
56 return u[0]*v[0]+u[1]*v[1]+u[2]*v[2];
66 xprintf(
Warn,
"Normalization of nearly zero vector.\n");
68 u[0] /= l; u[1] /= l; u[2] /= l;
75 u[ 0 ] *= k; u[ 1 ] *= k; u[ 2 ] *= k;
86 x[ 0 ] = u[ 1 ] * v[ 2 ] - u[ 2 ] * v[ 1 ];
87 x[ 1 ] = u[ 2 ] * v[ 0 ] - u[ 0 ] * v[ 2 ];
88 x[ 2 ] = u[ 0 ] * v[ 1 ] - u[ 1 ] * v[ 0 ];
95 x[ 0 ] = u[ 0 ] - v[ 0 ];
96 x[ 1 ] = u[ 1 ] - v[ 1 ];
97 x[ 2 ] = u[ 2 ] - v[ 2 ];
115 return a[0][0]*
SUBDET2(1,2,1,2)
127 *b=1/(*a);
return (*a);
147 if ( fabs(Det) <
NUM_ZERO )
return Det;
149 b[1][0]=-a[1][0]/Det;
150 b[0][1]=-a[0][1]/Det;
167 Det=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];
168 if ( fabs(Det)<
NUM_ZERO)
return Det;
169 b[0][0]/=Det; b[1][0]/=Det; b[2][0]/=Det;
187 double u[6], l[6], Det;
205 b[0][0]=+a[1][1]*l[5]-a[1][2]*l[4]+a[1][3]*l[3];
206 b[1][0]=-a[1][0]*l[5]+a[1][2]*l[2]-a[1][3]*l[1];
207 b[2][0]=+a[1][0]*l[4]-a[1][1]*l[2]+a[1][3]*l[0];
208 b[3][0]=-a[1][0]*l[3]+a[1][1]*l[1]-a[1][2]*l[0];
210 Det=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];
211 if ( fabs(Det)<
NUM_ZERO)
return Det;
212 b[0][0]/=Det; b[1][0]/=Det; b[2][0]/=Det; b[3][0]/=Det;
214 b[0][1]=(-a[0][1]*l[5]+a[0][2]*l[4]-a[0][3]*l[3])/Det;
215 b[1][1]=(+a[0][0]*l[5]-a[0][2]*l[2]+a[0][3]*l[1])/Det;
216 b[2][1]=(-a[0][0]*l[4]+a[0][1]*l[2]-a[0][3]*l[0])/Det;
217 b[3][1]=(+a[0][0]*l[3]-a[0][1]*l[1]+a[0][2]*l[0])/Det;
219 b[0][2]=(+a[3][1]*u[5]-a[3][2]*u[4]+a[3][3]*u[3])/Det;
220 b[1][2]=(-a[3][0]*u[5]+a[3][2]*u[2]-a[3][3]*u[1])/Det;
221 b[2][2]=(+a[3][0]*u[4]-a[3][1]*u[2]+a[3][3]*u[0])/Det;
222 b[3][2]=(-a[3][0]*u[3]+a[3][1]*u[1]-a[3][2]*u[0])/Det;
224 b[0][3]=(-a[2][1]*u[5]+a[2][2]*u[4]-a[2][3]*u[3])/Det;
225 b[1][3]=(+a[2][0]*u[5]-a[2][2]*u[2]+a[2][3]*u[1])/Det;
226 b[2][3]=(-a[2][0]*u[4]+a[2][1]*u[2]-a[2][3]*u[0])/Det;
227 b[3][3]=(+a[2][0]*u[3]-a[2][1]*u[1]+a[2][2]*u[0])/Det;
236 printf(
"matrix %d x %d :\n",size,size);
237 for (i=0;i<size;i++) {
238 for(j=0;j<size;j++) printf(
"%f ",mtx[i*size+j]);
252 for(row=0;row<n-1;row++) {
254 Div=a[row][row];a[row][row]=1;
255 for(col=0;col<n;col++) a[row][col]/=Div;
257 for(subrow=row+1;subrow<n;subrow++) {
258 Mult=a[subrow][row];a[subrow][row]=0;
259 for(col=0;col<n;col++) a[subrow][col]-=a[row][col]*Mult;
263 Div=a[row][row];a[row][row]=1;
264 for(col=0;col<n;col++) a[row][col]/=Div;
268 for(subrow=row-1;subrow>=0;subrow--) {
269 Mult=a[subrow][row];a[subrow][row]=0;
270 for(col=0;col<n;col++) a[subrow][col]-=a[row][col]*Mult;
280 int gauss(
double *A,
double *B,
int s,
double *R)
282 int res=1,i,j,k,size;
286 M = (
double *)
xmalloc( (size-1) * size *
sizeof(double));
290 M[i*(size)+j]=A[i*s+j];
293 for(i=0;i<size-1;i++)
297 for(j=i+1;j<size-1;j++)
304 M[j*size+k]=M[i*size+k];
313 if (fabs(max)<fabs(M[i*size+k])) max=fabs(M[i*size+k]);
317 for(j=i+1;j<size-1;j++)
321 koef=M[i*size+i]/M[j*size+i];
323 if((M[i*size+i]>=0 && M[j*size+i]>=0) ||
324 (M[i*size+i]<0 && M[j*size+i]<0)) koef*=-1;
326 M[j*size+k]=M[j*size+k]*koef + M[i*size+k];
331 for(i=size-1-1;i>=0;i--)
334 for(j=i+1;j<size-1;j++)
336 koef=koef+R[j]*M[i*size+j];
338 if (!(
DBL_EQ(M[i*size+i],0)))
340 R[i]=(M[i*size + size-1]-koef)/M[i*size+i];
343 if (koef==0 && M[i*size + size-1]==0)
366 return fi * 180 /
M_PI;
374 double *B,
int rb,
int cb,
double *X)
377 ASSERT(!(ca != rb),
"Matrix A has different number of columns than matrix B rows in the function matrix_x_matrix()\n");
378 for (i = 0; i < ra; i++)
379 for (j = 0; j < cb; j++)
382 for (k = 0; k < rb; k++)
383 X[ i * cb + j] += A[ i * ca + k] * B[ k * cb + j];