#include <stdio.h>
#include <rc/math.h>
#define DIM 3
int main()
{
double det;
rc_matrix_t A = RC_MATRIX_INITIALIZER;
rc_matrix_t A_dup = RC_MATRIX_INITIALIZER;
rc_matrix_t B = RC_MATRIX_INITIALIZER;
rc_matrix_t B_dup = RC_MATRIX_INITIALIZER;
rc_matrix_t C = RC_MATRIX_INITIALIZER;
rc_vector_t b = RC_VECTOR_INITIALIZER;
rc_vector_t y = RC_VECTOR_INITIALIZER;
printf("Let's test some matrix functions....\n\n");
printf("\nzeros Matrix:\n");
rc_matrix_zeros(&A,DIM,DIM);
rc_matrix_print(A);
printf("\nIdentity Matrix:\n");
rc_matrix_identity(&A,DIM);
rc_matrix_print(A);
printf("\nNew Random Vector b:\n");
rc_vector_random(&b,DIM);
rc_vector_print(b);
printf("\nDiagonal Matrix from b:\n");
rc_matrix_diagonal(&A,b);
rc_matrix_print(A);
printf("\nNew Random Matrix A:\n");
rc_matrix_random(&A,DIM,DIM);
rc_matrix_print(A);
printf("\nDuplicate A into B:\n");
rc_matrix_duplicate(A,&B);
rc_matrix_print(B);
printf("\nMatrix B in sci notation:\n");
rc_matrix_print_sci(B);
printf("\nMatrix B times 2.0:\n");
rc_matrix_times_scalar(&B,2.0);
rc_matrix_print(B);
printf("\nDeterminant of A:");
det = rc_matrix_determinant(A);
printf("%8.6lf\n", det);
printf("\nDeterminant of B:");
det = rc_matrix_determinant(B);
printf("%8.6lf\n", det);
printf("\nThree ways to multiply:");
printf("\nA*B=C:\n");
rc_matrix_multiply(A,B,&C);
rc_matrix_print(C);
printf("\nleft multiply inplace B=A*B\n");
rc_matrix_duplicate(B,&B_dup);
rc_matrix_left_multiply_inplace(A,&B_dup);
rc_matrix_print(B_dup);
printf("\nright multiply inplace A=A*B\n");
rc_matrix_duplicate(A,&A_dup);
rc_matrix_right_multiply_inplace(&A_dup,B);
rc_matrix_print(A_dup);
printf("\ntwo ways to add:");
printf("\nA+B=C:\n");
rc_matrix_add(A,B,&C);
rc_matrix_print(C);
printf("\ninplace: A=A+B:\n");
rc_matrix_duplicate(A,&A_dup);
rc_matrix_add_inplace(&A_dup,B);
rc_matrix_print(A_dup);
printf("\ntwo ways to transpose:");
printf("\nC=A':\n");
rc_matrix_transpose(A,&C);
rc_matrix_print(C);
printf("\ninplace: A=A'\n");
rc_matrix_duplicate(A,&A_dup);
rc_matrix_transpose_inplace(&A_dup);
rc_matrix_print(A_dup);
printf("\nrow vector b times A:\n");
rc_matrix_row_vec_times_matrix(b,A,&y);
rc_vector_print(y);
printf("\nA times column vector b\n");
rc_matrix_times_col_vec(A,b,&y);
rc_vector_print(y);
printf("\nouter product C=b*y\n");
rc_matrix_outer_product(b,y,&C);
rc_matrix_print(C);
printf("\nDONE\n");
return 0;
}