首页 / C++ / C++实现对角矩阵(一维数组实现)
C++实现对角矩阵(一维数组实现)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++实现对角矩阵(一维数组实现),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4902字,纯文字阅读大概需要8分钟。
内容图文
![C++实现对角矩阵(一维数组实现)](/upload/InfoBanner/zyjiaocheng/629/3e2cdff05f324899b292129a4f9cd148.jpg)
原理
当且仅当i不等于j时,M(i,j)=0为对角矩阵
一个rows X rows的对角矩阵D可以表示为一个二维数组element[rows][rows],其中element[i-1][j-1]表示D(i,j)。
这种表示法需要rows*rows个类型为T的数据空间。然而,对角矩阵对多只有rows个非0元素,因此可以用一维数组element[rows]来表示对角矩阵,其中elemennt[i-1]表示D(i,j).
所有未在一维数组中出现的矩阵元素均为0。这种表示法仅需要rows个类型为T的数据空间。
diagonalMatrix实现可对角矩阵转置输出加减乘除等操作。异常处理为自定义异常类型。不影响观看。可自己定义自己的异常类型。
此为《数据结构、算法与应用C++描述》书籍内容习题解答汇总
diagonalMatrix.h
#include <iostream>
#include "myExceptions.h"
template<class T>
class diagonalMatrix
{
friend std::ostream& operator<<
(ostream& out, const diagonalMatrix<T>& dm);
public:
diagonalMatrix(int theN = 10);
diagonalMatrix(const diagonalMatrix<T>& dm);
~diagonalMatrix() { delete[] element; }
T get(int i, int j) const;
void set(int i, int j, const T& newValue);
diagonalMatrix<T> tranpose();//转置矩阵
diagonalMatrix<T>& operator=(const diagonalMatrix<T>& dm);
diagonalMatrix<T> operator+(const diagonalMatrix<T>& dm) const;//二元正号
diagonalMatrix<T> operator-() const;//一元负号
diagonalMatrix<T> operator-(const diagonalMatrix<T>& dm) const;//二元负号
diagonalMatrix<T> operator*(const diagonalMatrix<T>& dm) const;
diagonalMatrix<T>& operator+=(const T& x);
diagonalMatrix<T>& operator-=(const T& x);
diagonalMatrix<T>& operator/=(const T& x);
diagonalMatrix<T>& operator*=(const T& x);
private:
int n; //矩阵维数
T* element;//存储对角矩阵的一维数组
};
template<class T>
diagonalMatrix<T>::diagonalMatrix(int theN)
{//构造函数
//检验theN值是否有效
if (theN < 1)
throw illegalParameterValue("Matrix size must be > 0");
n = theN;
element = new T[n];
}
template<class T>
diagonalMatrix<T>::diagonalMatrix(const diagonalMatrix<T>& dm)
{//赋值构造
n = dm.n;
element = new T[n];
std::copy(dm.element, dm.element + n, element);
}
template<class T>
T diagonalMatrix<T>::get(int i, int j) const
{//返回矩阵中(i,j)位置上的元素
if (i<1 || j<1 || i>n || j>n)
throw matrixIndexOutOfBounds();
return (i == j) ? element[i - 1] : 0;
}
template<class T>
void diagonalMatrix<T>::set(int i, int j, const T& newValue)
{//存储(i,j)项的新值
if (i<1 || j<1 || i>n || j>n)
throw matrixIndexOutOfBounds();
if (i == j)
element[i - 1] = newValue;
else
if (newValue != 0)
throw illegalParameterValue("nondiagonal elements must be zero");
}
template<class T>
diagonalMatrix<T> diagonalMatrix<T>::tranpose()
{//转置矩阵,具体是修改本身矩阵还是返回值传递。。。
//看需求吧.例如可以是 void trandpose(diagonalMatrix<T>& dm)
diagonalMatrix<T> w(n);
for (int i = 0; i < n; ++i)
w.element[i] = element[i];
return w;
}
template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator=(const diagonalMatrix<T>& dm)
{//=号
if(this !=&dm)
{//是否=于了自己
delete[] element;
n = dm.n;
element = new T[n];
std::copy(dm.element, dm.element + n, element);
}
return *this;
}
template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator+(const diagonalMatrix<T>& dm) const
{//二元加号
if (n != dm.n)
throw matrixSizeMismatch();
diagonalMatrix<T> w(n);
for (int i = 0; i < n; ++i)
w.element[i] = element[i] + dm.element[i];
return w;
}
template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator-() const
{//一元负号
diagonalMatrix<T> w(n);
for (int i = 0; i < n; ++i)
w.element[i] = -element[i];
return w;
}
template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator-(const diagonalMatrix<T>& dm) const
{//二元负号
if (n != dm.n)
throw matrixSizeMismatch();
diagonalMatrix<T> w(n);
for (int i = 0; i < n; ++i)
w.element[i] = element[i] - dm.element[i];
return w;
}
template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator*(const diagonalMatrix<T>& dm) const
{//乘法
if (n != dm.n)
throw matrixSizeMismatch();
diagonalMatrix<T> w(n);
for (int i = 0; i < n; ++i)
w.element[i] = element[i] * dm.element[i];
return w;
}
template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator+=(const T& x)
{//+=
for (int i = 0; i < n; ++i)
element[i] += x;
return *this;
}
template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator-=(const T& x)
{//-=
for (int i = 0; i < n; ++i)
element[i] -= x;
return *this;
}
template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator/=(const T& x)
{// /=
for (int i = 0; i < n; ++i)
element[i] /= x;
return *this;
}
template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator*=(const T& x)
{//*=
for (int i = 0; i < n; ++i)
element[i] *= x;
return *this;
}
template<class T>
std::ostream& operator<<
(ostream& out, const diagonalMatrix<T>& dm)
{//输出
for (int i = 0; i < dm.n; i++)
{
for (int j = 0; j < dm.n; j++)
if (i == j)
out << dm.element[i] << " ";
else
out << 0 << " ";
out << endl;
}
return out;
}
std::ostream& operator<<
(ostream& out, const diagonalMatrix<int>& dm)
{//出于某些原因,编译器不能自己创建这个。书上这么介绍的。不书写的话会出现一个链接错误。暂时没有找到原因
for (int i = 0; i < dm.n; i++)
{
for (int j = 0; j < dm.n; j++)
if (i == j)
out << dm.element[i] << " ";
else
out << 0 << " ";
out << endl;
}
return out;
}
内容总结
以上是互联网集市为您收集整理的C++实现对角矩阵(一维数组实现)全部内容,希望文章能够帮你解决C++实现对角矩阵(一维数组实现)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。