C++初学笔记“模板”:矩阵运算

这篇具有很好参考价值的文章主要介绍了C++初学笔记“模板”:矩阵运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++初学笔记“模板”:矩阵运算

(后期补充!这张图可以帮助理解复制构造函数和构造函数之间的关系。) 

C++初学“模板”:矩阵运算

 

一道作业题,题目:

(1)定义类模板T_Counter,实现基本类型数据的 + 、 - 、 * 、 = 、 >> 、 << 运算;
(2)类模板T_Matrix,实现矩阵运算。

(题目要求很模糊,我为了少出点bug降低难度以交作业,都是写最简单的情况,其实最理想的应该就是写矩阵,n维向量,complex等都更实用)

先单看(2)的代码;

主函数:

#include"T_Matrix.h"
#include <iostream>

int main()
{
    T_Matrix<int>c1(2);
    T_Matrix<int> c2(2);
    cout << "c1+c2=" << c1 + c2 << endl;
    cout << "c1-c2=" << c1 - c2 << endl;
    cout << "c1*c2=" << c1 * c2 << endl;
}

再添加一个类模板T_Matrix:

头文件如下:

#pragma once
//只定义+,-,*运算,且只做一维向量(二维做数组套娃)
//简言之,两个矩阵相加减,即它们相同位置的元素相加减!
//(上下这两条都是运算规则说明,因为没听过矩阵运算是啥)
//注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的.
#include<iostream>
using namespace std;
template<typename T>
class T_Matrix
{
public:
	T_Matrix(int n);
	virtual ~T_Matrix();
	T_Matrix(const T_Matrix& c1);
	//重载构造函数,如果没有会执行发生错误,应该是占同一块动态内存之类的
	//且运算符时执行了4次重载构造函数,同时马上执行析构函数,而不是我想象的整个程序结束后才来3次析构;
	//已经打上函数执行提示了,可以深入继续思考内存的关系

private:
	T* mdata;
	int size=0;//数据个数
	template<typename T>//为什么都定义在private?
	friend T_Matrix<T> operator+(const T_Matrix<T>c1, const T_Matrix<T>c2);
	template<typename T>
	friend T_Matrix<T> operator-(const T_Matrix<T>c1, const T_Matrix<T>c2);
	template<typename T>
	friend T_Matrix<T> operator*(const T_Matrix<T>c1, const T_Matrix<T>c2);

	template < typename T>
	friend ostream& operator<<(ostream& os, const T_Matrix<T>& c3);

};

template<typename T>
inline T_Matrix<T>::T_Matrix(int n)
{
	if (n > 0)
		size = n;
	mdata = new T[size];
	for (int i = 0; i < n; i++)
	{
		cout << "输入第" << i+1 << "个数据:";
		cin >> mdata[i];
	}
	cout << "构造函数执行" << endl;
}

template<typename T>
inline T_Matrix<T>::~T_Matrix()
{
	delete[]mdata;
	cout << "析构函数已执行" << endl;
}

template<typename T>
inline T_Matrix<T>::T_Matrix(const T_Matrix& c1)
{
	cout << "重载构造函数" << endl;
	size = c1.size;
	mdata = new T[size];
	for (int i = 0; i < size; i++)
		mdata[i] = c1.mdata[i];
}

template<typename T>
inline T_Matrix<T> operator+(const T_Matrix<T> c1, const T_Matrix<T> c2)
{
	T_Matrix<T>c3 = c1;
	for (int i = 0; i < c3.size; i++)
	{
		c3.mdata[i] = c1.mdata[i] + c2.mdata[i];
	}
	return c3;
}

template<typename T>
inline T_Matrix<T> operator-(const T_Matrix<T> c1, const T_Matrix<T> c2)
{
	T_Matrix<T>c3 = c1;
	for (int i = 0; i < c3.size; i++)
	{
		c3.mdata[i] = c1.mdata[i] - c2.mdata[i];
	}
	return c3;
}

template<typename T>
inline T_Matrix<T> operator*(const T_Matrix<T> c1, const T_Matrix<T> c2)
{
	T_Matrix<T>c3 = c1;
	for (int i = 0; i < c3.size; i++)
	{
		c3.mdata[i] = c1.mdata[i] * c2.mdata[i];
		//A(ij)=a1(i,...)*a2(...,j)i为第一个的行,j为第二个的列
	}
	return c3;
}

template<typename T>
inline ostream& operator<<(ostream& os, const T_Matrix<T>& c3)
{
	os << "(";
	for (int i = 0; i < c3.size; i++)
	{
		os << c3.mdata[i];
		if (i != c3.size)
			os << ",";
	}
	os << ")" << endl;
	// TODO: 在此处插入 return 语句
	return os;
}

这基本就是我的原代码(搞这作业前后也出不少乌龙,bug,尤其是我一开始函数的实现是写在类的cpp文件里的...怎么都是报错,我还看不懂那种。。。最后才知道模板得都写在头文件里...)

瞎bb环节:

这算是发的第一篇比较像那么回事的正式文吧。

发文章也就当作笔记了,作业做不少,个人注释也写得比较勤(因为感觉自己比较菜,很容易忘记思路,注释还可以挑出当时遇到了什么问题和哪些注意点),但很少回看,只有有时会发现写过类似函数回去复制粘贴“代码重用”......

而在这发,不仅笔记看得舒服,还容易分类,特别是比起原代码文件更像真正的学习笔记一样容易写总结体会;更希望会有人来看来一起交流,指导指导。 

 下面再附上(1)的码:

// testN3.02.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//(1)定义类模板T_Counter,实现基本类型数据的 + 、 - 、 * 、 = 、 >> 、 << 运算;
//(2)类模板T_Matrix,实现矩阵运算。


#include <iostream>
#include"T_Count.h"
using namespace std;

int main()
{
	T_Count<int> t1(5), t2(6);
	cout << "t1+t2=" << t1 + t2 << endl;
	T_Count<int> t3,t4;
	t3 = t1 + t2;
	cout << "t3=" << t3 << endl;
	cout << "t1-t2=" << t1 - t2 << endl;

	cout << "t1*t2=" << t1 * t2 << endl;
	t3 = t1=t2;
	cout << "t3=t1=t2=" << t3 << endl;
	cout << "t1-t2=" << t1 - t2 << endl;
	t4 = t1;
	cout << "t4=t1 -> t4=" << t4 << endl;
	cin >> t4;
	cout << "(new)t4=" << t4 << endl;
}

T_Count.h: 

#pragma once
#include<iostream>
using namespace std;
//要把定义也写在头文件里才行...
template<typename T>
class T_Count
{
public:
	T_Count();
	T_Count(T ni);
private:
	template<typename T> friend T_Count<T> operator+(const T_Count<T> t1, const T_Count<T> t2);
	template<typename T> friend T_Count<T> operator-(const T_Count<T>& t1, const T_Count<T>& t2);
	template<typename T> friend T_Count<T> operator*(const T_Count<T> t1, const T_Count<T> t2);
	//template<typename T> T_Count<T> operator=(const T_Count<T> t1);
	// Matirx<T>& operator=(const Matirx<T> & Other)
	template<typename T>
	T_Count<T>& operator=(const T_Count<T>& t1)
	{
		T r = t1.inter;
		return T_Count(r);
	}
	template<typename T> friend ostream& operator<<(ostream& os, const T_Count<T>& t1);
	template<typename T> friend istream& operator>>(istream& is, T_Count<T>& t1);

	T inter; 
};

template<typename T>
T_Count<T>::T_Count()
{
	inter = 0;
}
template<typename T>
T_Count<T>::T_Count(T ni)
{
	inter = ni;
}

template<typename T>
T_Count<T> operator+(const T_Count<T> t1, const T_Count<T> t2)
{
	T n = t1.inter + t2.inter;
	return T_Count<T>(n);
}

template<typename T>
inline T_Count<T> operator-(const T_Count<T>& t1, const T_Count<T>& t2)
{
	T n = t1.inter - t2.inter;
	return T_Count<T>(n);
}

template<typename T>
inline T_Count<T> operator*(const T_Count<T> t1, const T_Count<T> t2)
{
	T n = t1.inter * t2.inter;
	return T_Count<T>(n);
}


template<typename T>
ostream& operator<<(ostream& os, const T_Count<T>& t1)
{
	os << t1.inter;
	return os;
}

template<typename T>
istream& operator>>(istream& is, T_Count<T>& t1)
{
	cout << "输入一个新的T_Count类型的对象:";
	is >> t1.inter;
	return is;
}

想改个名,就叫洛特大修行ing

night night~文章来源地址https://www.toymoban.com/news/detail-424322.html

到了这里,关于C++初学笔记“模板”:矩阵运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 矩阵基本运算(C++)

    闲着没事,将以前利用C++实现的矩阵各种运算整理了一下,分享一下,矩阵运算包括: 1、二维矩阵创建                                        6、两矩阵上下叠加 2、两矩阵相加                                           7、矩阵左右叠加 3、两矩阵

    2023年04月09日
    浏览(28)
  • MATLAB入门——矩阵运算笔记

    3-3 MATLAB矩阵运算_哔哩哔哩_bilibili 以索引( 索引就是该数字在矩阵里是第几个 )为横坐标 以 空格或逗号 分割同一行元素, 分号 分隔各行 5.1 转置  5.2 取逆  5.3 求特征值和特征向量  5.4 乘法  5.5 点乘(对应元素相乘)

    2024年02月05日
    浏览(34)
  • 如何在C++中实现复数矩阵运算

    复数: 需要包含头文件: 两种赋值方法 矩阵: VS2019需要自己安装Eigen库:(41条消息) 基于VS2019的Eigen库安装详解_人狮子的博客-CSDN博客_eigen库安装vs 使用Eigen库 Eigen::Matrix Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_ 可以看到Matrix这个类有六个参数,下面是六个参数的具体解释 S

    2024年02月15日
    浏览(26)
  • 【C++实验】运算符重载(两个矩阵相加)

    运算符重载 概念 对已有的运算符赋予新的含义,用一个运算符表示不同功能的运算,从而适用于用户自定义类型的数据(比如复数、矩阵等)之间的运算 运算符重载 方法 定义一个重载运算符函数,在需要时系统自动调用该函数,完成相应的运算。 运算符重载实质上是函数

    2024年02月02日
    浏览(34)
  • 用Python实现矩阵运算【学习笔记】

    Pandas:Python中一个强大的分析结构化数据的工具集,可用于快速实现数据的导入/导出,索引。 Matplotlib:Python基础绘图库,几行代码即可生成绘图,直方图、条形图、散点图等。 NumPy:使用Python进行科学计算的基础软件包。核心:基于N维数组对象ndarray的数组运算。 现有矩阵

    2024年02月11日
    浏览(35)
  • R语言学习笔记——矩阵的运算

    1.矩阵的运算 1.1矩阵的转置        t()  1.2求矩阵的行列式        det()  1.3求矩阵的内积 (1)%*%  (2)crossprod(x,y)等价于t(x)%*%y 1.4矩阵的外积 (1)%o%  (2)outer(x,y)  (3)tcrossprod(x,y)等价于x%*%t(y)  1.5矩阵的乘积(矩阵A的列数等于矩阵B的行数) 运行结果展示 结

    2024年02月08日
    浏览(34)
  • C++ 二维差分 二维前缀和逆运算 差分矩阵

    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c ,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上 c 。 请你将进行完所有操作后的矩阵输出。 输入格式 第一行包含整数

    2024年02月21日
    浏览(42)
  • C++借助Eigen库实现矩阵开方(开根号)运算

    在matlab中我们可以通过sqrtm()函数实现简单的矩阵开方运算,当使用C++时,可以通过以下函数实现。 1、添加头文件: 2、开方函数: 3、主函数调用 在matlab中我们可以通过sqrtm()函数实现简单的矩阵开方运算,当使用C++时,可以通过以上函数实现。

    2024年02月15日
    浏览(24)
  • 【基础算法】矩阵的几种基本运算 & C++实现

            从线性代数中我们已知,两个矩阵可以进行加减乘运算,但矩阵之间没有除法运算。(下面以3×3矩阵为例):          矩阵的数乘运算类属与两矩阵相乘的一种特殊形式(数乘矩阵的这个数,我们可以将其化为对角线为该数,其余位置都为0的矩阵,再用该对

    2024年02月11日
    浏览(40)
  • 初学opencv c++学习笔记(五)透视变换--warpPerspective()

    这篇博客将用简单的口吻谈一谈透视变换是啥以及如何操作~    但是这篇博客,只要你看了,我相信会有收获~~~~~~~ ~~~~~~~~~   ~~~~~~~~~ 目录 一、透视变换介绍 1.基础介绍: 二、透视变换apl介绍---- warpPerspective() 1.官方定义 2.参数解释 三、搭配apl介绍---- getPerspectiveTransform()

    2024年01月21日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包