Пример #1
0
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;
}
Пример #2
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;
}