矩陣操作(更新使用class重新編寫)

矩陣的簡單操作

/*
 * matrix.cpp
 *
 *  Created on: Apr 9, 2014
 *      Author: qinf
 */

#include <iostream>
#include <stdexcept>
using std::cin;
using std::cout;
using std::endl;

struct Matrix {
	int **data;
	int row;
	int col;
	//init
	void init_array(int row, int col) {
		int i, j;
		this->row = row;
		this->col = col;
		//c++不能直接定義二維數組
		data = new int*[row];
		for (int i = 0; i != row; ++i)
			data[i] = new int[col];
		for (i = 0; i != row; ++i) {
			for (j = 0; j != col; ++j)
				data[i][j] = 0;
		}
	}
	//destory
	void destroy_array() {
		int i = 0;
		for (; i != row; ++i)
			delete[] data[i];
	}
	//mul
	void mul_array(int x) {
		int i, j;
		for (i = 0; i != row; ++i) {
			for (j = 0; j != col; ++j)
				data[i][j] = data[i][j] * x;
		}
	}
	//print
	void print() {
		int i, j;
		for (i = 0; i != row; ++i) {
			for (j = 0; j != col; ++j)
				cout << data[i][j] << " ";
			cout << endl;
		}
	}
	//矩陣相加
	void add_array(Matrix *B, Matrix *C) {
		int new_row = row;
		int new_col = B->col;
		C->row = new_row;
		C->col = new_col;
		C->init_array(new_row, new_col);
		int i, j, k, tmp;
		for (i = 0; i != new_col; ++i) {
			for (j = 0; j != new_row; ++j) {
				tmp = 0;
				for (k = 0; k != this->col; ++k)
					tmp += data[i][k] + B->data[k][j];
				C->data[i][j] = tmp;
			}
		}
	}
	//矩陣相乘
	void mul_array(Matrix *B, Matrix *C) {
		if (this->col != B->row)
			throw std::runtime_error("error");
		if (this->row != C->row || B->col != C->col)
			throw std::runtime_error("error");
		int i, j, k, tmp;
		for (i = 0; i != this->row; ++i) {
			for (j = 0; j != B->col; ++j) {
				tmp = 0;
				for (k = 0; k != this->col; ++k)
					tmp += data[i][k] * B->data[k][j];
				C->data[i][j] = tmp;
			}
		}
	}
};

int main(int argc, char *argv[]) {
	Matrix a, b, c;
	a.row = 2;
	a.col = 2;
	a.init_array(2, 2);
	c.row = 2;
	c.col = 3;
	c.init_array(2, 3);
	int i, j;
	for (i = 0; i != a.row; ++i)
		for (j = 0; j != a.col; ++j)
			a.data[i][j] = 1;
	a.print();
//	b.row = 2;
//	b.col = 3;
//	b.init_array(2, 3);
	b.row = b.col = 2;
	b.init_array(2, 2);
	for (i = 0; i != b.row; ++i)
		for (j = 0; j != b.col; ++j)
			b.data[i][j] = 1;
	//a.mul_array(2);
	//a.mul_array(&b, &c);
	a.add_array(&b, &c);
	c.print();
	return 0;
}


/*
 * Matrix.h
 *
 *  Created on: Apr 11, 2014
 *      Author: qinf
 */

#ifndef MATRIX_H_
#define MATRIX_H_

#include <iostream>
#include <stdexcept>

class Matrix {
public:
	Matrix(int row, int col);
	void add(Matrix B, Matrix &C);
	void mul_array(int x);
	void mul_array(Matrix &B, Matrix &C);
	void print();
	void set_value(int *data, int m, int n);
	~Matrix();
private:
	int _row;
	int _col;
	int **_data;
};

#endif /* MATRIX_H_ */

/*
 * Matrix.cpp
 *
 *  Created on: Apr 11, 2014
 *      Author: qinf
 */

#include "Matrix.h"

Matrix::Matrix(int row, int col) :
		_row(0), _col(0) {
	// TODO Auto-generated constructor stub
	//c++不能直接定義二維數組
	_row = row;
	_col = col;
	_data = new int*[_row];
	for (int i = 0; i != row; ++i) {
		_data[i] = new int[_col];
	}
	for (int i = 0; i != _row; ++i) {
		for (int j = 0; j != _col; ++j)
			_data[i][j] = 0;
	}
}

void Matrix::set_value(int *data, int m, int n) {
	for (int i = 0; i != m; ++i) {
		for (int j = 0; j != n; ++j)
			_data[i][j] = *(data + n * i + j);
	}
}

void Matrix::add(Matrix B, Matrix &C) {
	if (_row != B._row || _row != C._row || B._row != C._row) {
		throw std::runtime_error("row's value not equal");
	}
	if (_col != B._col || _col != C._col || B._col != C._col) {
		throw std::runtime_error("col's value not equal");
	}
	for (int i = 0; i != _row; ++i) {
		for (int j = 0; j != _col; ++j) {
			C._data[i][j] = _data[i][j] + C._data[i][j];
		}
	}
}
void Matrix::mul_array(int x) {
	for (int i = 0; i != _row; ++i) {
		for (int j = 0; j != _col; ++j) {
			_data[i][j] = _data[i][j] * x;
		}
	}
}
void Matrix::mul_array(Matrix &B, Matrix &C) {
	if (_row != C._row || _col != B._row || B._col != C._col)
		throw std::runtime_error("matrix not match");
	for (int i = 0; i != _row; ++i) {
		for (int j = 0; j != C._col; ++j) {
			int tmp = 0;
			for (int k = 0; k != _col; ++k)
				tmp += _data[i][k] * B._data[k][j];
			C._data[i][j] = tmp;
		}
	}
}
void Matrix::print() {
for (int i = 0; i != _row; ++i)
	for (int j = 0; j != _col; ++j) {
		if (j != _col - 1)
			std::cout << _data[i][j] << " ";
		else
			std::cout << _data[i][j] << std::endl;
	}
}

Matrix::~Matrix() {
for (int i = 0; i != _row; ++i)
	delete[] _data[i];
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章