#! /usr/bin/gawk -f # Last edited on 2005-12-11 02:10:50 by stolfi BEGIN { split("", M); row = 0; } /^[ ]*([\#]|$)/ { next; } // { gsub(/[^-+0-9.]/, " ", $0); if (NF != 3) { printf "bad matrix\n" > "/dev/stderr"; } row++; for (col = 1; col <= 3; col++) { M[row,col] = $(col)+0; } } END { fflush("/dev/stdout"); # Print matrix {M} for (row = 1; row <= 3; row++) { for (col = 1; col <= 3; col++) { printf " %+9.6f", M[row,col]; } printf "\n"; } fflush("/dev/stdout"); # Compute adjoint {K} of {M}: split("", K); K[1,1] = + M[2,2]*M[3,3] - M[2,3]*M[3,2]; K[2,1] = - M[2,1]*M[3,3] + M[2,3]*M[3,1]; K[3,1] = + M[2,1]*M[3,2] - M[2,2]*M[3,1]; K[1,2] = - M[1,2]*M[3,3] + M[1,3]*M[3,2]; K[2,2] = + M[1,1]*M[3,3] - M[1,3]*M[3,1]; K[3,2] = - M[1,1]*M[3,2] + M[1,2]*M[3,1]; K[1,3] = + M[1,2]*M[2,3] - M[1,3]*M[2,2]; K[2,3] = - M[1,1]*M[2,3] + M[1,3]*M[2,1]; K[3,3] = + M[1,1]*M[2,2] - M[1,2]*M[2,1]; # Compute determinant {D} of {M}: D = M[1,1]*K[1,1] + M[1,2]*K[2,1] + M[1,3]*K[3,1]; # Scale {K} by {1/D}, print: printf "\n"; for (row = 1; row <= 3; row++) { for (col = 1; col <= 3; col++) { K[row,col] /= D; printf " %+9.6f", K[row,col]; } printf "\n"; } fflush("/dev/stdout"); # Check product: printf "\n"; for (row = 1; row <= 3; row++) { for (col = 1; col <= 3; col++) { P = 0; for (k = 1; k <= 3; k++) { P += M[row,k]*K[k,col]; } printf " %+9.6f", P; } printf "\n"; } fflush("/dev/stdout"); }