int qr_decom(Matrix *src_matr, Matrix *q_matr, Matrix *r_matr) { size_t row_len = src_matr->row_len; size_t col_len = src_matr->col_len; Matrix ortho_matr, coef_matr, d_matr, d_inv_matr; ortho_decom(src_matr, &ortho_matr, &coef_matr); init_matrix(&d_matr, col_len, col_len); size_t j; float *ortho_arr = ortho_matr.arr; float *d_arr = d_matr.arr; for (j = 0; j < col_len; j++) { float sum_multi = col_vec_multi(ortho_arr, ortho_arr, j, j, col_len, row_len); *(d_arr + j * col_len + j) = sum_multi; } inverse(&d_matr, &d_inv_matr); init_matrix(q_matr, row_len, col_len); init_matrix(r_matr, col_len, col_len); multiple(&ortho_matr, &d_inv_matr, q_matr); multiple(&d_matr, &coef_matr, r_matr); //clear release_matrix(&ortho_matr); release_matrix(&coef_matr); release_matrix(&d_matr); release_matrix(&d_inv_matr); return 0; }
int main(int argc, char ** argv) { if (argc < 2) { cout << "Incorrect parameters" << endl; printUsage(); exit(1); } string db_path(argv[1]); string db_file = db_path + DIR_SEP + EMDDB_INDEX; string out_filepath; if (argc > 2) { out_filepath = argv[2]; } else { out_filepath = db_path + DIR_SEP + DEFAULT_OUT_FILE; } string log_path; if (argc > 3) { log_path = argv[3]; } else { log_path = db_path + DIR_SEP + DEFAULT_LOG_FILE; } log_stream = new ofstream(log_path.c_str()); *log_stream << "db_path,img1,img2,sig1_points,sig2_points,sig1_weight_sum,sig2_weight_sum,emd_time" << endl; EmdDB db; int result = db.load(db_file); if (result) { cout << "Unable to open db at " << db_file << ". Check the path is correct" << endl; exit(1); } double ** mat = new double*[db.numEntries]; for (int i=0; i<db.numEntries; i++) mat[i] = new double[db.numEntries]; cout << "computing distance matrix..." << endl; result = compute_distance_matrix(db, mat); if (result) { cout << "failed to compute distance matrix" << endl; exit(1); } cout << "saving distance matrix..." << endl; result = save_distance_matrix(out_filepath, mat, db.numEntries); // We don't need to load matrix. This fails. // TODO load matrix without header //cout << "loading distance matrix..." << endl; //double ** mat2 = load_distance_matrix(out_filepath); //if (mat2 == NULL) //{ // cout << "Failed to load matrix" << endl; // exit(1); //} // TODO check doesn't work due to output accuracy //cout << "checking matrix..." << endl; //for (int i=0; i<db.numEntries; i++) // for (int j=0; j<db.numEntries; j++) // { // if (mat[i][j] != mat2[i][j]) // { // cout << "Bad matrix values at " << i << "," << j << endl; // exit(1); // } // } log_stream->close(); release_matrix(mat, db.numEntries); //release_matrix(mat2, db.numEntries); return 0; }