#define M 3
#define N 3
/* pseudoinverse */
int main() {
/* non-singular matrix rank(a) == 3 */
array double a[M][N] = {1, 2, 3,
5, 5, 6,
7, 8, 9};
int r;
array double pinv[N][M];
r = rank(a);
pinv = pinverse(a);
printf("rank(a) = %d\n", r);
printf("pinverse(a) = \n%f\n", pinv);
printf("a*pinverse(a)*a = \n%f\n", a*pinv*a);
printf("pinverse(a)*a*pinverse(a) = \n%f\n", pinv*a*pinv);
}
rank(a) = 3
pinverse(a) =
-0.500000 1.000000 -0.500000
-0.500000 -2.000000 1.500000
0.833333 1.000000 -0.833333
a*pinverse(a)*a =
1.000000 2.000000 3.000000
5.000000 5.000000 6.000000
7.000000 8.000000 9.000000
pinverse(a)*a*pinverse(a) =
-0.500000 1.000000 -0.500000
-0.500000 -2.000000 1.500000
0.833333 1.000000 -0.833333