如何用容器类构造矩阵?

wengzuliang 2003-09-30 09:20:22
如题
...全文
95 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
iBuffer 2003-10-13
  • 打赏
  • 举报
回复
稀疏矩阵之我的方法:
用一个一维数组表示列,然后以数组的每个元素建立map作为行。
各位大侠给点意见
snipersu 2003-10-10
  • 打赏
  • 举报
回复
牛X!
Robin 2003-10-07
  • 打赏
  • 举报
回复
hehe!
都不错!
短歌如风 2003-10-07
  • 打赏
  • 举报
回复
稀疏矩阵则可以用map实现:
template<typename T>
class matrix
{
int row_count;
int col_count;
T default_value;
mutable map<pair<int, int>, T> data;
public:
class value_ref//封装元素引用类型的类,在赋值时可能会向map中添加新的元素或删除元素,取值时会在map中不存在指定行、列号时返回缺省值。

{
map<pair<int, int>, T> & data_ref;
int row_index;
int col_index;
T default_value;
public:
value_ref(map<pair<int, int>, T>& init_data_ref, int init_row_index, int init_col_index, T init_default_value):
data_ref(init_data_ref),
row_index(init_row_index),
col_index(init_col_index),
default_value(init_default_value)
{
}
T& operator = (const T& new_value)
{
if (new_value == default_value)
{
map<pair<int,int>,T>::iterator i = data_ref.find(pair<int, int>(row_index, col_index));
if (i != data_ref.end())
data_ref.erase(i);
}
else
data_ref[pair<int, int>(row_index, col_index)] = new_value;
}
operator T() const
{
map<pair<int, int>, T>::iterator i = data_ref.find(pair<int, int>(row_index, col_index));
if (i == data_ref.end())
return default_value;
else
return i->second;
}
};
matrix(int init_row_count, int init_col_count, T init_default_value):
col_count(init_row_count),
row_count(init_col_count),
default_value(init_default_value)
{}
value_ref get_value(int row_index, int col_index)
{
return value_ref(data, row_index, col_index, default_value);
}
const value_ref get_value(int row_index, int col_index) const
{
return value_ref(data, row_index, col_index, default_value);
}
int get_col_count() const
{
return col_count;
}
int get_row_count() const
{
return row_count;
}
value_ref operator()(int row_index, int col_index)
{
return get_value(row_index, col_index);
}
const value_ref operator()(int row_index, int col_index) const
{
return get_value(row_index, col_index);
}
};

上面的代码没有考虑行、列号越限的情况,如果要求更安全,可以加上这一内容。
短歌如风 2003-10-07
  • 打赏
  • 举报
回复
Matrix本身就是一个逻辑概念,不适合于直接使用vector等容器表现,可以使用某一容器实现,但应该使用组合而不是继承。
要实现一个一般的矩阵可以这样:

template<typename T>
class matrix
{
int row_count;
int col_count;
vector<T> data;
public:
matrix(int init_row_count, int init_col_count):
col_count(init_row_count),
row_count(init_col_count),
data(init_row_count * init_col_count)
{}
T& get_value(int row_index, int col_index)
{
return data[row_index * col_count + col_index];
}
const T& get_value(int row_index, int col_index) const
{
return data[row_index * col_count + col_index];
}
int get_col_count() const
{
return col_count;
}
int get_row_count() const
{
return row_count;
}
T& operator()(int row_index, int col_index)
{
return get_value(row_index, col_index);
}
const T& operator()(int row_index, int col_index) const
{
return get_value(row_index, col_index);
}
};

由于矩阵运算经常要在不同行列数的矩阵间进行(如乘法),所以把矩阵的行、列数作为状态而不是类型。

fifo333 2003-10-06
  • 打赏
  • 举报
回复
我也是用上述方法,很方便。
维数可以用模板参数设定,也可以用构造函数设定。
但如果要实现矩阵分解、稀疏矩阵、求秩等功能就比较复杂了。
这种方法基本的功能和运算都可以实现。
数据结构STL实现(好像是这个书名)中也是这样实现的。
C++和面向对象数值计算一书中有更复杂完善的实现,可以参考。
xueweizhong 2003-10-06
  • 打赏
  • 举报
回复
template <class T>
struct Matrix : vector<vector<T> >
{
T& operator () (int i, int j)
{
return at(i).at(j);
}
T const& operator () (int i, int j) const
{
return at(i).at(j);
}
....
};

序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
GDI+ SDK参考(翻译版本) 序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
GDI+用法参考,各种函数的参数说明。 序言 4 目标 4 适用范围 4 适用读者 4 运行环境 4 文档组织 4 相关主题 4 GDI+的安全考虑 6 检验构造函数调用成功与否 6 分配缓冲区 6 错误校验 8 线程同步 9 相关主题 10 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
GDI+ SDK参考中文版 即GDI+ SDK参考手册的翻译版本,希望对大家有用! 目录: 关于GDI+ 11 GDI+ 介绍 11 GDI+ 概览 11 GDI+ 的三个组成部分 11 基于的接口架构 12 GDI+提供了哪些新东西? 12 新特征 12 编程模式的改变 15 线条、曲线和图形 19 矢量图概览 19 钢笔、线条和矩形 20 椭圆和弧 22 多边形 22 基数样条 23 贝塞尔样条 24 路径 25 画刷和填充图形 27 开放与闭合曲线 29 区域 30 裁剪 31 路径平直化 32 线条和曲线的抗锯齿功能 32 图象、位图和图元文件 33 位图型 34 图元文件 37 绘制、定位和复制图片 39 裁剪和缩放图象 40 坐标系统和转换 42 坐标系统型 42 以矩阵来表示转换 44 全局和局部转换 48 图形容器 51 使用GDI+ 56 使用入门 56 绘制线条 56 绘制字符串 58 使用钢笔绘制线条和形状 59 使用钢笔绘制线条和矩形 59 设置钢笔的宽度和对齐方式 60 绘制具有线帽的线条 61 联接线条 62 绘制自定义虚线 62 绘制用纹理填充的线条 63 使用画笔填充形状 63 用纯色填充形状 64 用阴影图案填充形状 64 用图像纹理填充形状 64 在形状中平铺图像 65 用渐变色填充形状 68 使用图像、位图和图元文件 68 加载和显示位图 68 加载和显示图元文件 69 记录图元文件 69 剪裁和缩放图像 71 旋转、反射和扭曲图像 72 缩放时使用插值模式控制图像质量 73 创建缩略图像 75 采用高速缓存位图来提高性能 76 通过避免自动缩放改善性能 76 读取图像元数据 77 使用图像编码器和解码器 83 列出已安装的编码器 83 列出已安装的解码器 84 获取解码器的标识符 86 获取编码器的参数列表 88 将BMP图像转换为PNG图像 100 设定JPEG的压缩等级 101 对JPEG图像进行无损变换 102 创建和保存多帧图像 105 从多帧图像中复制单帧 107 Alpha 混合线条和填充 109 绘制不透明和半透明的线条 109 用不透明和半透明的画笔绘制 110 使用复合模式控制 Alpha 混合 111 使用颜色矩阵设置图像中的 Alpha 值 112 设置单个象素的alpha值 114 使用字体和文本 115 构造字体系列和字体 115 绘制文本 116 格式化文本 117 枚举已安装的字体 120 创建专用的字体集合 122 获取字体规格 126 对文本使用消除锯齿效果 130 构造并绘制曲线 131 绘制基数样条曲线 131 绘制贝塞尔样条 133 用渐变画刷填充形状 134 创建线性渐变 134 创建路径渐变 137 将 Gamma 校正应用于渐变 144 构造并绘制路径 145 使用线条、曲线和形状创建图形 145 填充开放式图形 147 使用图形容器 147 管理 Graphics 对象的状态 148 使用嵌套的 Graphics 容器 151 变换 154 使用世界变换 154 为什么变换顺序非常重要 155 使用区域 156 对区域使用点击检测 156 对区域使用剪辑 157 对图像重新着色 158 使用颜色矩阵对单色进行变换 158 转换图像颜色 160 缩放颜色 161 旋转颜色 164 剪取颜色 166 使用颜色重映射表 168 打印 169 将GDI+输出至打印机 169 显示一个打印对话框 172 通过提供打印机句柄优化打印 173 附录:GDI+ 参考 176
Microsoft Windows GDI+是为C/C++开发者提供的一个基于的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于Microsoft Win32的应用程序不能直接访问图形硬件,而是通过GDI+来协调设备驱动和程序动作的交互。GDI+同样支持Microsoft Win64。 适用范围 GDI适用于所有的Window应用程序。GDI+是包含于Windows XP和Windows Server 2003中的一项新技术。运行于Microsoft Windows NT 4.0 SP6、Windows 2000、Windows 98 和 Windows Me操作系统的应用程序在分发的时候需要包含GDI+。 适用读者 GDI+ C++ 基接口是为C/C++开发者所设计。需要精通Windows图形用户接口和消息驱动机制。 目录 序言 - 4 - 目标. - 4 - 适用范围 - 4 - 适用读者 - 4 - 运行环境 - 4 - 文档组织 - 4 - 相关主题 - 4 - GDI+的安全考虑 - 6 - 检验构造函数调用成功与否 - 6 - 分配缓冲区 - 6 - 错误校验 - 7 - 线程同步 - 9 - 相关主题 - 10 - 关于GDI+ - 11 - GDI+ 介绍 - 11 - GDI+ 概览. - 11 - GDI+ 的三个组成部分 . - 11 - 基于的接口架构 - 12 - GDI+提供了哪些新东西? - 12 - 新特征 - 12 - 编程模式的改变 - 15 - 线条、曲线和图形 - 19 - 矢量图概览 - 19 - 钢笔、线条和矩形 - 20 - 椭圆和弧 - 22 - 多边形 - 22 - 基数样条 - 23 - 贝塞尔样条 - 24 - 路径 - 25 - 画刷和填充图形 - 27 - 开放与闭合曲线 - 29 - 区域 - 30 - 裁剪 - 31 - 路径平直化 - 32 - 线条和曲线的抗锯齿功能 - 32 - 图象、位图和图元文件 - 33 - 位图型 - 34 - 图元文件 - 37 - 绘制、定位和复制图片 - 39 - 裁剪和缩放图象 - 40 - 坐标系统和转换 - 42 - 坐标系统型 - 42 - - 2 - 以矩阵来表示转换 - 44 - 全局和局部转换 - 48 - 图形容器 - 51 - 使用GDI+ - 56 - 使用入门 - 56 - 绘制线条 - 56 - 绘制字符串 - 58 - 使用钢笔绘制线条和形状 - 59 - 使用钢笔绘制线条和矩形 - 59 - 设置钢笔的宽度和对齐方式 - 60 - 绘制具有线帽的线条 - 61 - 联接线条 - 62 - 绘制自定义虚线 - 62 - 绘制用纹理填充的线条 - 63 - 使用画笔填充形状 - 63 - 用纯色填充形状 - 64 - 用阴影图案填充形状 - 64 - 用图像纹理填充形状 - 64 - 在形状中平铺图像 - 65 - 用渐变色填充形状 - 68 - 使用图像、位图和图元文件 - 68 - 加载和显示位图 - 68 - 加载和显示图元文件 - 69 - 记录图元文件 - 69 - 剪裁和缩放图像 - 71 - 旋转、反射和扭曲图像 - 72 - 缩放时使用插值模式控制图像质量 - 73 - 创建缩略图像 - 75 - 采用高速缓存位图来提高性能 - 76 - 通过避免自动缩放改善性能 - 76 - 读取图像元数据 - 77 - 使用图像编码器和解码器 - 83 - 列出已安装的编码器 - 83 - 列出已安装的解码器 - 84 - 获取解码器的标识符 - 86 - 获取编码器的参数列表 - 88 - 将BMP图像转换为PNG图像 . - 100 - 设定JPEG的压缩等级 - 101 - 对JPEG图像进行无损变换 - 102 - 创建和保存多帧图像 - 105 - 从多帧图像中复制单帧 - 107 - Alpha 混合线条和填充 - 109 - 绘制不透明和半透明的线条 - 109 - 用不透明和半透明的画笔绘制 - 110 - - 3 - 使用复合模式控制 Alpha 混合 . - 111 - 使用颜色矩阵设置图像中的 Alpha 值 . - 112 - 设置单个象素的alpha值 . - 114 - 使用字体和文本 - 115 - 构造字体系列和字体 - 115 - 绘制文本 - 116 - 格式化文本 - 117 - 枚举已安装的字体 - 120 - 创建专用的字体集合 - 122 - 获取字体规格 - 126 - 对文本使用消除锯齿效果 - 130 - 构造并绘制曲线 - 131 - 绘制基数样条曲线 - 131 - 绘制贝塞尔样条 - 133 - 用渐变画刷填充形状 - 134 - 创建线性渐变 - 134 - 创建路径渐变 - 137 - 将 Gamma 校正应用于渐变 - 144 - 构造并绘制路径 - 145 - 使用线条、曲线和形状创建图形 - 145 - 填充开放式图形 - 147 - 使用图形容器 - 147 - 管理 Graphics 对象的状态 - 148 - 使用嵌套的 Graphics 容器 - 151 - 变换. - 154 - 使用世界变换 - 154 - 为什么变换顺序非常重要 - 155 - 使用区域 - 156 - 对区域使用点击检测 - 156 - 对区域使用剪辑 - 157 - 对图像重新着色 - 158 - 使用颜色矩阵对单色进行变换 - 158 - 转换图像颜色 - 160 - 缩放颜色 - 161 - 旋转颜色 - 164 - 剪取颜色 - 166 - 使用颜色重映射表 - 168 - 打印. - 169 - 将GDI+输出至打印机 - 169 - 显示一个打印对话框 - 172 - 通过提供打印机句柄优化打印 - 173 - 附录:GDI+ 参考 - 176 -

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧