public double [,] generate_linear_matrix(Vector3 [] new_positions, double beta) { double [,] r = generate_rotation_matrix(new_positions); double [,] a = MatrixFunctions.matrixMultiply3x3(apq, aqq); //Rotation_test.print_matrix(aqq); double determinant = alglib.rmatrixdet(a); determinant = Mathf.Pow((float)determinant, 1.0f / 3.0f); MatrixFunctions.scalar_multiply(ref a, beta / determinant); MatrixFunctions.scalar_multiply(ref r, 1 - beta); MatrixFunctions.matrix_add_3x3(ref a, r); return(a); }
public double [,] generate_rotation_matrix(Vector3 [] new_positions) { //3x3 matrix of zeros used for summation apq = new double [, ] { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } }; for (int i = 0; i < original_positions.Length; i++) { MatrixFunctions.matrix_add_3x3(ref apq, MatrixFunctions.vector3_covariance(new_positions[i], original_positions[i])); //CHECKED: new positions are different from old ones, seem consitent } //CHECKED THROUGH THIS POINT s = MatrixFunctions.matrixMultiply3x3(MatrixFunctions.transpose3x3(apq), apq); MatrixFunctions.matrixInverseSquareRoot(ref s); double [,] r = MatrixFunctions.matrixMultiply3x3(apq, s); return(r); }