自学内容网 自学内容网

QT 中如何保存matlab 能打开的.mat数据矩阵!

Windows 上安装并使用 MATIO 库来保存 MATLAB 格式的 .mat 文件,需要进行以下步骤:

1. 下载并安装 CMake

MATIO 使用 CMake 构建项目,因此你需要先安装 CMake。

  • 前往 CMake 官网下载适用于 Windows 的安装程序并安装。

2. 下载 MATIO 库源码

  • 访问 MATIO 的 GitHub 页面 或 MATIO 的 SourceForge 页面 下载库的源码。
  • 解压下载的源码到一个方便的位置。

3. 安装依赖项

MATIO 依赖于 zlibhdf5,你需要安装它们并将其配置在 Windows 上:

(a) 安装 zlib
(b) 安装 hdf5
  • 从 HDF5 官网下载适用于 Windows 的 HDF5 库。
  • 按照 HDF5 提供的安装说明进行操作,确保在编译时提供正确的路径。

4. 配置并编译 MATIO

一旦你拥有了 zlibhdf5,就可以通过以下步骤来配置并编译 MATIO

  1. 打开 CMake 并设置 MATIO 的源码路径和生成二进制文件的输出路径。
  2. 点击“Configure”按钮,选择你的生成工具(通常是 Visual Studio)。
  3. 在配置过程中,CMake 会要求你指定 zlibhdf5 的路径。设置好这两个库的路径后,点击“Generate”。
  4. 打开生成的 Visual Studio 解决方案,编译 MATIO。

5. 将 MATIO 集成到你的项目

编译成功后,MATIO 库会生成 .lib.dll 文件。你可以将这些库文件和头文件集成到你的项目中:

  1. 在项目的编译设置中,添加 MATIO 的包含路径以及 zlibhdf5 的路径。
  2. MATIO.lib 文件添加到链接器设置中。
  3. 确保在运行程序时,MATIO.dll 文件位于可执行文件所在目录或系统的路径中。
INCLUDEPATH +=$$PWD/include/matio
INCLUDEPATH +=$$PWD/include
LIBS += $$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

这里需要 完整的库的可以下方留言。


原文地址:https://blog.csdn.net/weixin_43608857/article/details/142719913

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!