Mat

Mat的释放
Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1;                        // 仅创建一个mat2信息头, mat1,mat2 数据区的地址相同
Mat mat3 = Mat::zeros(1, 4, CV_32F);
mat2.release();          //  因为mat2是对mat1的引用,这里的mat2.release()只会清除mat2的信息头和数据指针
mat1.release();         //  mat1的数据区都会被释放,但是mat信息头数据还会保存(也就是还能继续被赋值)
cout << mat1 << endl;
cout << mat2 << endl;
cout << mat3 << endl << endl;
mat3.copyTo(mat1);// 拷贝会给mat1从新分配数据区域,其原来的数据区还会保留,即mat2的数据是原来mat1的数据,
//mat1 = mat3.clone();  // 最终结果是mat1和mat3的数据相同,但是数据存储空间不同,  mat2存储的是mat1最初的值
mat3.release();        // mat3的释放不会影响mat1
cout << mat1 << endl;
cout << mat2 << endl;
cout << mat3 << endl << endl;

有关注释读起来比较拗口,上面的例子最好调试下。总之,对于Mat的引用(也就是浅复制,只分配信息头,数据区共享)情况下的释放,只会清除本身的信息头和置零数据区指针,不会影响被赋值的矩阵。Mat有一个引用机制,有一个成员变量refcount,会自己根据被引用和释放的次数,自动管理内存,所以一般不需要用户自己去释放。对于创建类型的构造函数(深复制),那么会有属于自己的数据区,完全和被赋值的矩阵可以独立开

### 关于MAT文件及其处理 #### MATLAB中的MAT文件概述 MATLAB(Matrix Laboratory)采用 `.mat` 文件格式用于存储和加载数据。这种文件格式是二进制形式,可以保存多种类型的变量,如矩阵、向量、结构体以及元胞数组等[^1]。 #### 处理MAT文件的方法 对于MAT文件的操作主要包括读取与写入两个方面: - **读取MAT文件** 使用 `load` 函数可以从现有的`.mat`文件中导入数据到工作区中。如果想要指定要加载的具体变量名,则可以在调用该函数时提供相应的参数。 ```matlab % 加载整个.mat文件的内容至当前工作空间 load('example.mat'); % 只加载特定名称的数据项 data = load('example.mat', 'variableName'); ``` - **创建并保存MAT文件** 利用 `save` 命令可将内存里的变量序列化成磁盘上的`.mat`文件。同样支持选择性地只导出某些感兴趣的变量。 ```matlab % 将workspace里所有的变量都存入新的.mat文件 save('newfile.mat'); % 把单个或多个选定的变量保存下来 save('selectedVariables.mat','varA','-v7.3'); % 这里指定了版本号-v7.3以兼容不同版本间的互操作性 ``` #### 批量化转换MAT文件为PNG图像 当涉及到批量处理任务时,比如把一系列MAT文件转储为可视化的图片格式(例如 PNG),可以通过编写脚本来自动化这一过程。下面给出了一种方法来遍历目录下的所有`.mat`文件,并将其可视化后另存为同名但扩展名为.png的新文件[^2]。 ```python import os from scipy.io import loadmat import matplotlib.pyplot as plt for each_mat in os.listdir(): if not each_mat.endswith('.mat'): continue first_name, _ = os.path.splitext(each_mat) try: mat_data = loadmat(each_mat)['yourVariable'] # 替换'yourVariable'为你实际想绘制的那个变量的名字 fig = plt.figure() ax = fig.add_subplot(111) cax = ax.imshow(mat_data, interpolation='nearest') fig.colorbar(cax) output_path = f"{first_name}.png" plt.savefig(output_path) plt.close(fig) except Exception as e: print(f"Error processing {each_mat}: ", str(e)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值