⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.cc

📁 由matlab开发的hybrid系统的描述语言
💻 CC
字号:
#include "Matrix.h"#include <stdio.h>#include "Plus_expr.h"Matrix::Matrix() {	dim_checked = false;	use_sparse_output = false;}Matrix::~Matrix() {	for (entries_iter iter = entries.begin(); iter != entries.end(); iter++)		delete(* iter).second;	entries.clear();}Matrix * Matrix::clone() const {	Matrix * res;	res = new Matrix();	res->dim_checked = dim_checked;	res->dim_x = dim_x;	res->dim_y = dim_y;	res->use_sparse_output = use_sparse_output;	for (const_entries_iter iter = entries.begin(); iter != entries.end();		iter++)res->set((* iter).first.get_y(), (* iter).first.get_x(),			(* iter).second->clone());	return res;}void Matrix::set(int y, int x, Expr * coeff) {	Matrix_entry_key key = Matrix_entry_key(y, x);	assert(y >= 0 && x >= 0); //fine	entries[key] = coeff;	if (!(dim_checked && x < dim_x && y < dim_y)) dim_checked = false;}Expr * Matrix::get(int y, int x) const {	const_entries_iter iter;	Matrix_entry_key key = Matrix_entry_key(y, x);	assert(y >= 0 && x >= 0); //fine	iter = entries.find(key);	if (iter != entries.end()) return (* iter).second->clone(); else		return NULL;}void Matrix::operator += (Matrix * add) {	entries_iter found;	Expr * tmp;	if (dim_checked && add->dim_checked) {		assert(dim_x == add->dim_x && dim_y == add->dim_y); //fine		dim_checked = true;	} else dim_checked = false;	for (entries_iter iter = add->entries.begin(); iter != add->entries.end();		iter++) {			if ((found = entries.find((* iter).first)) !=				entries.end()) {					tmp = (* found).second;					(* found).second =						new Plus_expr(tmp,						(* iter).second);			} else entries[(* iter).first] = (* iter).second;	}	add->entries.clear();	delete add; // ->shallow delete}string Matrix::to_matlab_sparse() const { return 0; }string Matrix::to_matlab_full() const {	string res;	int x, y;	const_entries_iter found;	if (!is_zeros()) {		res += "[\n";		for (y = 0; y < dim_y; y++) {			for (x = 0; x < dim_x; x++) {				Matrix_entry_key key = Matrix_entry_key(y, x);				found = entries.find(key);				if (found != entries.end())					res += (* found).second->to_matlab();				else res += "0";				res += " ";			}			res += ";\n";		}		res += "];\n";	} else {		char buf[100];		sprintf(buf, "zeros(%d, %d);\n", dim_y, dim_x);		res = string(buf);	}	return res;}string Matrix::to_matlab() const {	assert(dim_checked); //fine	if (use_sparse_output) return to_matlab_sparse(); else		return to_matlab_full();}void Matrix::concat_y(Matrix * down) {	entries_iter iter;	if (!dim_checked && is_zeros() && !down->dim_checked &&		down->is_zeros())return;	assert(dim_checked && down->dim_checked); //fine	assert(dim_x == down->dim_x); //fine	for (iter = down->entries.begin(); iter != down->entries.end();		iter++) {			Matrix_entry_key key =				Matrix_entry_key((* iter).first.get_y()				+ dim_y, (* iter).first.get_x());			entries[key] = (* iter).second;	}	dim_y += down->dim_y;	down->entries.clear();	delete down;}void Matrix::concat_x(Matrix * right) {	entries_iter iter;	if (!dim_checked && is_zeros() && !right->dim_checked &&		right->is_zeros())return;	assert(dim_checked && right->dim_checked); //fine	assert(dim_y == right->dim_y); //fine	for (iter = right->entries.begin(); iter != right->entries.end();		iter++) {			Matrix_entry_key key =				Matrix_entry_key((* iter).first.get_y(),				(* iter).first.get_x() + dim_x);			entries[key] = (* iter).second;	}	dim_x += right->dim_x;	right->entries.clear();	delete right;}bool Matrix::is_zeros() const {	return entries.empty();}void Matrix::check_dim(int y, int x) {	entries_iter iter;	for (iter = entries.begin(); iter != entries.end(); iter++) {		assert((* iter).first.get_x() < x); //fine		assert((* iter).first.get_y() < y); //fine	}	dim_y = y;	dim_x = x;	dim_checked = true;}int Matrix::get_dimy() {	if (!dim_checked && is_zeros()) return 0;	assert(dim_checked); //fine	return dim_y;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -