矩陣的簡單操作
/*
* 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];
}