libmatio開發筆記(一):matlab檔案操作libmatio庫介紹,編譯和基礎Demo

21497936發表於2021-11-21

前言

  Qt可透過matlab的庫對mat檔案進行讀寫,第三方庫matio也可以對mat檔案進行讀寫,其已經支援mat檔案的7.3版本。

libmatio庫介紹

  matio軟體包含一個用於讀寫MATLAB MAT fles的庫。libmatio庫是建立/開啟MAT fles和寫入的主要介面。
  matio庫可以編寫版本5的MAT fles,版本5的fles帶有可變壓縮(如果使用zlib構建),以及支援 引入的HDF5格式MAT file,即MATLAB 7.3版。

下載

  Git地址:
  官網:
  QQ群: 1047134658(點選“ 檔案”搜尋“ matio”,群內與博文同步更新)

Window上編譯(從原始碼使用VS工程直接編譯)

  編譯環境:VS2015(vs14版本)。

步驟一:下載解壓

   在這裡插入圖片描述

步驟二:開啟原始碼工程

  使用VS2015開啟庫中間的matio.sln(此處筆者是VS2017裝了VS2015的MSVC編譯器),如下圖:
   在這裡插入圖片描述
   在這裡插入圖片描述
   在這裡插入圖片描述
  修改編譯器版本
   在這裡插入圖片描述

步驟三:編譯libmatio,出現無法開啟”zlib.h”解決

  開始編譯,出現錯誤如下:
   在這裡插入圖片描述

  需要編譯zlib庫的x64版本,請參照博文《 zlib開發筆記(四):zlib庫介紹、編譯windows vs2015x64版本和工程模板》。
  將zlib標頭檔案和庫引入到libmatio工程中。
  標頭檔案路徑:
   在這裡插入圖片描述
  庫檔案路徑:
   在這裡插入圖片描述
  庫引入:
   在這裡插入圖片描述
  意味著還缺少hdf5檔案,還需要新增hdf5的msvc2015x64版本,暫時先不管,本步驟解決zlib問題,繼續編譯。

步驟四:編譯libmatio,出現無法開啟”hdf5.h”,解決

  編譯hdf5,請參考文章:《 Hdf5開發筆記(一):hdf5介紹,在windows上編譯msvc2015x64版本
    在這裡插入圖片描述
   在這裡插入圖片描述
  發現不行,重新開啟定位安裝檔案:
   在這裡插入圖片描述
   在這裡插入圖片描述
   在這裡插入圖片描述
  解決後,繼續編譯。

步驟五:編譯libmatio,呼叫引數太少

   在這裡插入圖片描述

  打架,只剩下可能是2個庫的升級依賴導致的問題,matio不相容hdf5的三個大版本的api。

步驟五:更換hdf5版本

  重新定義版本,Matio:1.5.12(與之前一樣),Hdf5:1.8.22(前面使用的是1.12.x),即更換hd5的版本即可。
  hdf5的編譯,請參照博文《Hdf5開發筆記(一):hdf5介紹,編譯和基礎模板Demo》
  然後更改包含的路徑:
   在這裡插入圖片描述

   在這裡插入圖片描述
  至此,此種方法編譯失敗,其庫的引數呼叫幾個版本的函式呼叫都沒有這個,摸索後基本放棄,只能另尋他法。

Window上編譯(CMake方式編譯)

  編譯環境:VS2015(vs14版本)。

步驟一:下載解壓

  直接git的
   在這裡插入圖片描述

步驟二:CMake配置

   在這裡插入圖片描述
   在這裡插入圖片描述
  編譯hdf5,請參考文章:《 Hdf5開發筆記(一):hdf5介紹,在windows上編譯msvc2015x64版本
  新增HDF5的路徑,如下圖:
   在這裡插入圖片描述
  zlib編譯,請參照博文《 zlib開發筆記(四):zlib庫介紹、編譯windows vs2015x64版本和工程模板》。
  新增zib,如下圖:
    在這裡插入圖片描述
  新增zlib的路徑,如下圖:
   在這裡插入圖片描述
  配置透過:
   在這裡插入圖片描述

步驟三:生成工程

   在這裡插入圖片描述

步驟四:開啟工程

    在這裡插入圖片描述

步驟五:工程生成

  開啟工程後,編譯
   在這裡插入圖片描述

步驟六:安裝

   在這裡插入圖片描述

模組化

   在這裡插入圖片描述

Demo

bool MatlabManager::openMatFile(QString filePath){
    mat_t *pMatFile = 0;
    matvar_t *pMatVar = 0;
    // 開啟mat檔案
    pMatFile = Mat_Open(filePath.toUtf8().data(), MAT_ACC_RDONLY);
    if(!pMatFile)
    {
        LOG << "Failed to Mat_Open(filePath.toUtf8().data(), MAT_ACC_RDONLY)";
        return false;
    }
    // 遍歷所有變數
    pMatVar = Mat_VarReadNext(pMatFile);
    while(pMatVar)
    {
        LOG << "read variable ============================="
            << "pMatVar->name:" << pMatVar->name << endl            << "pMatVar->rank:" << pMatVar->rank << endl            << "pMatVar->dims:" << pMatVar->dims << endl            << "pMatVar->class_type:" << pMatVar->class_type << endl            << "pMatVar->data_type:" << pMatVar->data_type << endl            << "pMatVar->isComplex:" << pMatVar->isComplex << endl            << "pMatVar->isLogical:" << pMatVar->isLogical << endl            << "pMatVar->isGlobal:" << pMatVar->isGlobal << endl;
        // 釋放
        Mat_VarFree(pMatVar);
        pMatVar = 0;
        // 繼續遍歷
        pMatVar = Mat_VarReadNextInfo(pMatFile);
    }
    // 關閉mat檔案
    Mat_Close(pMatFile);
    pMatFile = 0;
    return true;}

Demo測試

double資料型別

   在這裡插入圖片描述
   在這裡插入圖片描述
  

struct+doubleSeries型別

  先解析的是struct
   在這裡插入圖片描述

doubleSeries資料型別

   在這裡插入圖片描述
  檢視文件也只支援這幾種型別特殊檔案
   在這裡插入圖片描述
  doubleSeries是不支援的

工程模板

  testMatioDemo_工程模板_v1.0.0_基礎呼叫matio庫成功遍歷檔案.rar

若該文為原創文章,轉載請註明原文出處
本文章部落格地址: https://hpzwl.blog.csdn.net/article/details/116196923


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2843305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章