Windows 上安装并使用 MATIO
库来保存 MATLAB 格式的 .mat
文件,需要进行以下步骤:
1. 下载并安装 CMake
MATIO 使用 CMake 构建项目,因此你需要先安装 CMake。
- 前往 CMake 官网下载适用于 Windows 的安装程序并安装。
2. 下载 MATIO 库源码
- 访问 MATIO 的 GitHub 页面 或 MATIO 的 SourceForge 页面 下载库的源码。
- 解压下载的源码到一个方便的位置。
3. 安装依赖项
MATIO 依赖于 zlib
和 hdf5
,你需要安装它们并将其配置在 Windows 上:
(a) 安装 zlib
- 从 zlib 官网下载适用于 Windows 的
zlib
,或者可以在 GitHub 上找到源码。 - 将
zlib
源码解压到某个文件夹,并用 CMake 生成 Windows 平台的项目文件,然后用 Visual Studio 编译。 - 这里可参考Windows中zlib的安装与配置_zlib windows-CSDN博客
(b) 安装 hdf5
- 从 HDF5 官网下载适用于 Windows 的 HDF5 库。
- 按照 HDF5 提供的安装说明进行操作,确保在编译时提供正确的路径。
4. 配置并编译 MATIO
一旦你拥有了 zlib
和 hdf5
,就可以通过以下步骤来配置并编译 MATIO
:
- 打开 CMake 并设置 MATIO 的源码路径和生成二进制文件的输出路径。
- 点击“Configure”按钮,选择你的生成工具(通常是 Visual Studio)。
- 在配置过程中,CMake 会要求你指定
zlib
和hdf5
的路径。设置好这两个库的路径后,点击“Generate”。 - 打开生成的 Visual Studio 解决方案,编译 MATIO。
5. 将 MATIO 集成到你的项目
编译成功后,MATIO 库会生成 .lib
和 .dll
文件。你可以将这些库文件和头文件集成到你的项目中:
- 在项目的编译设置中,添加
MATIO
的包含路径以及zlib
和hdf5
的路径。 - 将
MATIO
的.lib
文件添加到链接器设置中。 - 确保在运行程序时,
MATIO
的.dll
文件位于可执行文件所在目录或系统的路径中。
INCLUDEPATH +=$$PWD/include/matioINCLUDEPATH +=$$PWD/includeLIBS += $$PWD/lib/libmatio.lib
其中用到的dill
lib
其中用到的
void PhaseUnwrapper::saveMatrixToMat(const cv::Mat& mat, const std::string& filename) {
mat_t *matfp = Mat_CreateVer(filename.c_str(), NULL, MAT_FT_MAT5); // 使用 MATLAB 5.x 格式
if (matfp == NULL) {
throw std::runtime_error("无法创建MAT文件: " + filename);
}
// 转换为double类型
cv::Mat mat_double;
if (mat.depth() != CV_64F) {
mat.convertTo(mat_double, CV_64F); // 转换为双精度浮点型
} else {
mat_double = mat;
}
// 获取行和列
int rows = mat_double.rows;
int cols = mat_double.cols;
size_t total_elements = static_cast<size_t>(rows) * static_cast<size_t>(cols);
// 线性化存储数据
std::vector<double> mat_data(total_elements);
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
mat_data[i + j * rows] = mat_double.at<double>(i, j); // 以列主序存储数据
}
}
// 定义维度
size_t dims[2] = { static_cast<size_t>(rows), static_cast<size_t>(cols) };
// 创建MAT变量
matvar_t *matvar = Mat_VarCreate("matrix", MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, mat_data.data(), 0);
if (matvar == NULL) {
Mat_Close(matfp);
throw std::runtime_error("无法创建MAT变量");
}
Mat_VarWrite(matfp, matvar, MAT_COMPRESSION_NONE);
Mat_VarFree(matvar);
Mat_Close(matfp);
std::cout << "矩阵已成功保存到 " << filename << std::endl;
}
int main() {
// 示例:创建一个 5x5 的矩阵
cv::Mat mat = (cv::Mat_<double>(5, 5) << 1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13, 14, 15,
16, 17, 18, 19, 20,
21, 22, 23, 24, 25);
// 保存到MAT文件
saveMatrixToMat(mat, "matrix.mat");
return 0;
}
最后保存下来的mat
这里需要 完整的库的可以下方留言。