John 发表于 2013-4-19 12:33:00

公式中如何调用 Matlab API

通过dll扩展,金魔方的公式可以调用 Matlab 的 api 进行运算,下面是一个例子:

1. 创建 win32 dll 工程,名称是 matlabDll
2. 在工程中设置输出路径(output file)为金魔方安装目录下的FmlDll子目录下,例如:
C:\kingtrader\FmlDll\matlabDll.dll
3. 调试时设置 debugging 的 command 为金魔方就可以了,例如:
C:\kingtrader\kingtrader.exe
4. 编写dll函数。下面的例子定义了函数myFunc, 是从公式中获取一个 10*10 的矩阵,运算后以数组的形式返回:
#include "stdafx.h"
#include "engine.h"

extern "C" __declspec(dllexport) void WINAPI myFunc(float*pInputArray, float*pOutputArray)
{
        Engine *p = engOpen(0);
        if(p)
        {
                mxArray *pA=0;
                char szBuffer;
                double *pTest=0;
                pA = mxCreateDoubleMatrix(10, 10, mxREAL);
                mxSetName(pA, "pTest");
                pTest = mxGetPr(pA);
                for(int i=0;i<10;i++)
                        for(int j=0;j<10;j++)
                                pTest = pInputArray;
                engPutArray(p, pA);
                engEvalString(p, "mesh(pTest);");
                engEvalString(p, "print picture.eps -deps;");
                engOutputBuffer(p, szBuffer, 300);
                engClose(p);
                mxDestroyArray(pA);
                for(int k=0; k<300; k++)
                        pOutputArray = szBuffer;
        }
}
5. 注意工程中需要添加 def 文件,否则公式有可能找不到 myFunc 函数,下面是 def 文件:
LIBRARY
EXPORTS
myFunc
6. 添加 matlab 的 include 文件路径,例如:
C:\MATLAB7\extern\include;$(IncludePath)\
7. 添加 matlab lib 的路径,例如:
C:\MATLAB7\extern\lib\win32\microsoft\msvc71\libmx.lib
C:\MATLAB7\extern\lib\win32\microsoft\msvc71\libmex.lib
C:\MATLAB7\extern\lib\win32\microsoft\msvc71\libeng.lib
8. 新版本的 matlab 不支持 mxSetName 函数了,
需要在 dll 项目的 preprocesser 中定义 V5_COMPAT 宏,否则不能编译通过
9. 以上设置好以后可以调试了,f5 运行,或者手动打开金魔方
10. 新建公式如下
#Run_By_Bar // 逐根模式执行
// dll 引用定义
extern 'matlabDll.dll' void myFunc(NumericArray InputArray, NumericArray OutputArray);
array:
  InputArray(0), // 声明 10*10 数组,初始值为0
  OutputArray(0);  // 声明 300 数组,初始值为0
variable:
  runOnce(0);

if runOnce = 0 then
begin
  myFunc(InputArray, OutputArray);
  runOnce = 1;
end  
11.编译公式并拖放到图上就可以调试了

benyip 发表于 2013-4-19 12:38:20

{:4_87:}{:4_86:}

侠客行 发表于 2013-4-19 13:19:09

{:4_86:}:victory:

凛冬将志 发表于 2013-4-20 10:02:26

{:4_86:}{:4_87:}{:4_88:}

花生油 发表于 2013-6-15 05:50:16

:D非常感谢

逍遥壶中仙 发表于 2013-6-20 06:50:55

哦,这个是好动西啊{:4_86:}

自游族 发表于 2013-6-25 19:50:59

逍遥壶中仙 发表于 2013-6-20 06:50 static/image/common/back.gif
哦,这个是好动西啊

必须再读几年IT专业,回头再来看,留个标记

逍遥壶中仙 发表于 2013-6-26 16:47:58

自游族 发表于 2013-6-25 19:50 static/image/common/back.gif
必须再读几年IT专业,回头再来看,留个标记

这个还是可以自学的哈呵呵

自游族 发表于 2013-6-26 17:01:07

逍遥壶中仙 发表于 2013-6-26 16:47 static/image/common/back.gif
这个还是可以自学的哈呵呵

学不动了

逍遥壶中仙 发表于 2013-6-26 17:03:01

自游族 发表于 2013-6-26 17:01 static/image/common/back.gif
学不动了

活到老学到老嘛{:1_1:},虽然说现在精力不如学生时期了哈
页: [1] 2 3 4
查看完整版本: 公式中如何调用 Matlab API