欢迎您光临博庭社区!

 找回密码
 立即注册
查看: 9405|回复: 28

公式中如何调用 Matlab API [复制链接]

Rank: 8Rank: 8

发表于 2013-4-19 12:33:00 |显示全部楼层
通过dll扩展,金魔方的公式可以调用 Matlab 的 api 进行运算,下面是一个例子:

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

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

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

使用道具 举报

Rank: 4

发表于 2013-4-19 12:38:20 |显示全部楼层

使用道具 举报

Rank: 4

勇士奖

发表于 2013-4-19 13:19:09 |显示全部楼层

使用道具 举报

Rank: 3Rank: 3

发表于 2013-4-20 10:02:26 |显示全部楼层

使用道具 举报

Rank: 6Rank: 6

发表于 2013-6-15 05:50:16 |显示全部楼层
非常感谢
学习成长中......榨油进行中......

使用道具 举报

Rank: 6Rank: 6

发表于 2013-6-20 06:50:55 |显示全部楼层
哦,这个是好动西啊

使用道具 举报

Rank: 6Rank: 6

激情奖

发表于 2013-6-25 19:50:59 |显示全部楼层
逍遥壶中仙 发表于 2013-6-20 06:50
哦,这个是好动西啊

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

使用道具 举报

Rank: 6Rank: 6

发表于 2013-6-26 16:47:58 |显示全部楼层
自游族 发表于 2013-6-25 19:50
必须再读几年IT专业,回头再来看,留个标记

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

使用道具 举报

Rank: 6Rank: 6

激情奖

发表于 2013-6-26 17:01:07 |显示全部楼层
逍遥壶中仙 发表于 2013-6-26 16:47
这个还是可以自学的哈呵呵

学不动了

使用道具 举报

Rank: 6Rank: 6

发表于 2013-6-26 17:03:01 |显示全部楼层
自游族 发表于 2013-6-26 17:01
学不动了

活到老学到老嘛,虽然说现在精力不如学生时期了哈

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

bottom

Archiver|http://www.patiosoft.com

GMT+8, 2017-12-17 08:39 , Processed in 0.072231 second(s), 10 queries .

花生网 Copyrigh©2012

和讯信息科技有限公司 ALL Rights Reserved 版权所有 复制必究

回顶部