- 注册时间
- 2012-4-9
- 最后登录
- 2014-8-22
- 阅读权限
- 200
- 积分
- 1307
- 精华
- 1
- 帖子
- 424
 
|
发表于 2013-4-19 12:33:00
|显示全部楼层
通过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[300];
- 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[i+10*j] = pInputArray[i+10*j];
- 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[k] = szBuffer[k];
- }
- }
复制代码 5. 注意工程中需要添加 def 文件,否则公式有可能找不到 myFunc 函数,下面是 def 文件: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[10,10](0), // 声明 10*10 数组,初始值为0
- OutputArray[300](0); // 声明 300 数组,初始值为0
- variable:
- runOnce(0);
- if runOnce = 0 then
- begin
- myFunc(InputArray, OutputArray);
- runOnce = 1;
- end
复制代码 11.编译公式并拖放到图上就可以调试了
|
|