矩阵操作(更新使用class重新编写)

来源:互联网 发布:清华社会科学学院 知乎 编辑:程序博客网 时间:2024/05/17 08:12

矩阵的简单操作

/* * 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;//initvoid 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;}}//destoryvoid destroy_array() {int i = 0;for (; i != row; ++i)delete[] data[i];}//mulvoid 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;}}//printvoid 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] << " ";elsestd::cout << _data[i][j] << std::endl;}}Matrix::~Matrix() {for (int i = 0; i != _row; ++i)delete[] _data[i];}


0 0
原创粉丝点击