int main(int argc, char const *argv[]) { Matrix a = matrixNew(555555, 2); Matrix b = matrixNew(2, 555555); //Matrix b = matrixNew(100, 100); for (int i = 0; i < matrixGetRows(a); i++) { for (int j = 0; j < matrixGetCols(a); j++) { //printf("%d ", (i + 5)); matrixSet(a, i, j, (float) (i + 5)); } // printf("\n"); } for (int i = 0; i < matrixGetRows(b); i++) { for (int j = 0; j < matrixGetCols(b); j++) { matrixSet(b, i, j, (float) 1.); } } //printMatrix(a); //printMatrix(b); Matrix c = matrixMul(a, b); //Matrix c = matrixNew(9, 13); printf("\n%d\n-----", (int) c); printMatrix(c); return 0; }
/// tests Matrix4 multiply method TEST_F(Math_Matrix4Tests, Multiply) { // Identity test matrixSet(i, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); matrixSet(m, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); Matrix4 i_check(i); Matrix4 m_check(m); actual.multiply(i, m); ASSERT_MATRIX_EQ(m, actual); // Identity test 2 actual.multiply(m, i); ASSERT_MATRIX_EQ(m, actual); // setup matrices matrixSet(m1, 5,-71,-13,86,-86,-8,-62,8,-69,-106,81,125,-1,-52,84,47); Matrix4 m1_check(m1); matrixSet(m2, -92,-59,-55,-91,47,-86,-93,-32,19,126,44,92,32,112,119,-94); Matrix4 m2_check(m2); matrixSet(expected, 8500,17566,-7245,-19536,14080,8873,-5500,-9775,-13869, -11805,3233,12466,-17589,-10894,-5617,14105); // perform test actual.multiply(m1,m2); ASSERT_MATRIX_EQ(expected, actual); // perform tests to ensure read-only memory didn't fail ASSERT_MATRIX_EQ(m1_check, m1); ASSERT_MATRIX_EQ(m2_check, m2); }
/// tests Matrix4 multiply and assign method TEST_F(Math_Matrix4Tests, MultiplyAndAssign) { // setup matrices matrixSet(actual, 5,-71,-13,86,-86,-8,-62,8,-69,-106,81,125,-1,-52,84,47); matrixSet(m1, -92,-59,-55,-91,47,-86,-93,-32,19,126,44,92,32,112,119,-94); matrixSet(expected, 8500,17566,-7245,-19536,14080,8873,-5500,-9775,-13869, -11805,3233,12466,-17589,-10894,-5617,14105); // perform test actual.multiply(m1); ASSERT_MATRIX_EQ(actual,expected); }
Matrix *matrixAdd (const Matrix *a, const Matrix *b) { Matrix *result; int column = a->columns, row = a->rows; if (a->columns != b->columns && a->rows != b->rows) return NULL; result = matrixAlloc (a->rows, a->columns); /* cycle through all rows */ for (row = 0 ; row < a->rows ; row++) { /* cycle through all columns */ for (column = 0 ; column < a->columns ; column++) { int val_1 = matrixGet (a, row, column); int val_2 = matrixGet (b, row, column); int val_res = val_1 / val_2; matrixSet (result, row, column, val_res); } } return result; }
Matrix *matrixMul (const Matrix *a, const Matrix *b) { int column = 0, row = 0, c = 0; Matrix *retval; if (a->columns != b->rows && a->rows > b->rows) { const Matrix *tmp; tmp = a; a = b; b = tmp; } if (a->columns != b->rows) return NULL; retval = matrixAlloc (a->rows , b->columns); for (; column < b->columns; column++) { for (row = 0; row < a->rows; row++) { double val = 0; for (c = 0; c < a->columns; c++) { val += matrixGet (a, row, c) * matrixGet (b, c, column); } matrixSet (retval, row, column, val); } } return retval; }
int main() { printf("Testing work:\n"); int n = 9; int m = 1; Matrix a = matrixNew(n, m); for (int i = 0; i < matrixGetRows(a); i++) for (int j = 0; j < matrixGetCols(a); j++) matrixSet(a, i, j, (float)(i + 1) / (j + 1)); for (int i = 0; i < matrixGetRows(a); i++) { for (int j = 0; j < matrixGetCols(a); j++) printf("%.5f ", matrixGet(a, i, j)); printf("\n"); } printf("\n"); Matrix b = matrixScale(a, 10); for (int i = 0; i < matrixGetRows(b); i++) { for (int j = 0; j < matrixGetCols(b); j++) printf("%.5f ", matrixGet(b, i, j)); printf("\n"); } printf("\n"); Matrix c = matrixAdd(a, b); for (int i = 0; i < matrixGetRows(c); i++) { for (int j = 0; j < matrixGetCols(c); j++) printf("%.5f ", matrixGet(c, i, j)); printf("\n"); } printf("\n"); Matrix d = matrixTranspose(c); for (int i = 0; i < matrixGetRows(d); i++) { for (int j = 0; j < matrixGetCols(d); j++) printf("%.5f ", matrixGet(d, i, j)); printf("\n"); } /*c = matrixAdd(a, matrixNew(1, 1)); if (c == NULL) printf("Yeah\n"), c = matrixNew(3, 3);*/ Matrix e = matrixMul(c, d); printf("%i %i\n", matrixGetRows(e), matrixGetCols(e)); for (int i = 0; i < matrixGetRows(e); i++) { for (int j = 0; j < matrixGetCols(e); j++) printf("%.5f ", matrixGet(e, i, j)); printf("\n"); } matrixDelete(a); matrixDelete(b); matrixDelete(c); matrixDelete(d); matrixDelete(e); return 0; }
/// tests Matrix4 createScaleMatrix TEST_F(Math_Matrix4Tests, ScaleMatrix) { actual.createScaleMatrix(1.1f, 2.2f, 3.3f); matrixSet(expected, 1.1f,0,0,0, 0,2.2f,0,0, 0,0,3.3f,0, 0,0,0,1); ASSERT_MATRIX_EQ(actual, expected); }
/// tests Matrix4 createTranslationMatrix TEST_F(Math_Matrix4Tests, TranslationMatrix) { actual.createTranslationMatrix(1.1f, 2.2f, 3.3f); matrixSet(expected, 1,0,0,0, 0,1,0,0, 0,0,1,0, 1.1f,2.2f,3.3f,1); ASSERT_MATRIX_EQ(actual, expected); }
Matrix *matrixCopy (const Matrix *matrix) { Matrix *retval; int column = matrix->columns, row = matrix->rows; retval = matrixAlloc (matrix->rows, matrix->columns); while (--row >=0) { column = matrix->columns; while (--column >= 0) matrixSet (retval, row, column, matrixGet (matrix, row, column)); } return retval; }