Qt和matlab混合編程:在Qt中使用Matlab編譯的文件

此係列包含兩個內容。

Matlab函數轉Qt具體操作步驟
鏈接:https://blog.csdn.net/baidu_32821143/article/details/82990956
Qt中Matlab庫函數的使用

在Qt中使用Matlab編譯的文件
設置Qt工程中的.pro文件

將Matlab生成的lib,h,dll拷貝到當下工程路徑內。
在.pro文件的空白處單擊右鍵,彈出庫類型的選擇,選擇外部庫,並單擊下一步。

選擇matlab編譯解壓後application文件中的lib文件,然後勾選如圖的按鈕,點擊下一步。

在.pro文件中生成如下圖紅圈內的內容。

添加所需要的matlab庫文件,選擇解壓for_redistribution中的mcr後的v93爲路徑,具體細節參考圖片。之所以使用$$quote,是爲了避免出現一些路徑中包含空格,或者無法從char轉換爲LPWSTR之類的錯誤。

執行qmake,構建工程。

在Qt中向matlab函數傳參
以此係列第一篇文章中的函數爲例:

GroupSelectiveAssembly中的所有輸入參數均爲1X1的double類型(可爲矩陣,可爲其他類型),輸出爲nXn的double矩陣。

在Qt中調用Matlab函數前,首先需調用初始化函數。

#include <SelectiveAssemblyModule.h>
void main()
{
 GroupSelectiveAssemblyInitialize();
 ...
}
123456

在Qt中設置C++輸入參數,設置成動態數組的原因是考慮到如果參數是未知大小,方便傳參。

// Input Parameter
    double *dTup1;
    dTup1=new double[1];
    dTup1[0]=4.001;
    double *dTdown1;
    dTdown1=new double[1];
    dTdown1[0]=3.993;
    double *dTup2;
    dTup2=new double[1];
    dTup2[0]=4.000;
    double *dTdown2;
    dTdown2=new double[1];
    dTdown2[0]=3.996;
    double *dinterval1;
    dinterval1=new double[1];
    dinterval1[0]=0.002;
    double *dinterval2;
    dinterval2=new double[1];
    dinterval2[0]=0.002;
    double *dTup;
    dTup=new double[1];
    dTup[0]=0.002;
    double *dTdown;
    dTdown=new double[1];
    dTdown[0]=-0.001;
    
    // Output Parameter
    double *drecommendation_all;
    drecommendation_all=new double[10000];
1234567891011121314151617181920212223242526272829

向Matlab的函數傳參需要將C++數據類型轉換爲mwArray類型,所以這裏定義一下mwarray類型的輸入輸出參數。

    mwArray Tup(1,1,mxDOUBLE_CLASS);
    mwArray Tup1(1,1,mxDOUBLE_CLASS);
    mwArray Tup2(1,1,mxDOUBLE_CLASS);
    mwArray Tdown(1,1,mxDOUBLE_CLASS);
    mwArray Tdown1(1,1,mxDOUBLE_CLASS);
    mwArray Tdown2(1,1,mxDOUBLE_CLASS);
    mwArray interval1(1,1,mxDOUBLE_CLASS);
    mwArray interval2(1,1,mxDOUBLE_CLASS);
    mwArray recommendation_all(1,1,mxDOUBLE_CLASS);
123456789
mwArray的第一個參數爲行數,第二個參數爲列數,第三個參數是類型,詳見Matlab幫助。

將C++數據類型轉換爲mwArray類型

    Tup.SetData(dTup,1);
    Tup1.SetData(dTup1,1);
    Tup2.SetData(dTup2,1);
    Tdown.SetData(dTdown,1);
    Tdown1.SetData(dTdown1,1);
    Tdown2.SetData(dTdown2,1);
    interval1.SetData(dinterval1,1);
    interval2.SetData(dinterval2,1);
12345678
使用SetData函數進行參數間的傳遞,第一個爲傳遞的C++數據類型,第二個爲參數個數(行數X列數)。

調用Matlab函數

GroupSelectiveAssembly(1, recommendation_all, Tup1, Tdown1,Tup2, Tdown2,interval1,interval2, Tup, Tdown);
1
GroupSelectiveAssembly第一個參數爲輸出參數個數(這裏只傳出一個recommendation_all),第二個爲輸出參數,第三個開始爲輸入參數。

傳出輸出參數

recommendation_all.GetData(drecommendation_all,recommendation_all.NumberOfElements());
1
使用GetData函數獲得輸出參數,第一個參數爲double類型的輸出參數,第二個爲輸出的元素個數,使用NumberOfElements獲得。

完成調用函數後,使用GroupSelectiveAssemblyTerminate() 結束調用。
可以qDebug()一下對應的輸出參數,對比一下在matlab中獲得的結果,看一下是否有錯誤。這裏一定要注意在Matlab中矩陣是列存儲,所以存儲到C中的數組,指針中一定將對應數據對應起來。可以qDebug()一下對應的輸出參數,對比一下在matlab中獲得的結果,看一下是否有錯誤。這裏一定要注意在Matlab中矩陣是列存儲,所以存儲到C中的數組,指針中一定將對應數據對應起來。
--------------------- 
作者:SharingFisher 
來源:CSDN 
原文:https://blog.csdn.net/baidu_32821143/article/details/82993401 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章