怎样在Delphi中调用Matlab ActiveX接口中的GetFullMatrix和PutFullMatrix命令(200分)

  • 主题发起人 主题发起人 海客
  • 开始时间 开始时间

海客

Unregistered / Unconfirmed
GUEST, unregistred user!
在Matlab的帮助文档中说有五个ActiveX接口可以被外部程序所调用。
其中Execute等三个可以我可以在Delphi中正常使用。但是,GetFullMatrix
和PutFullMatrix 在Delphi中调用时总是出错,不知是何原因?
 
刚才我所提的问题可能有点不清楚,在这里,我想再说明一下:

我所使用的程序如下
procedure TForm1.Button1Click(Sender: TObject);
var
Matlab:Variant;
MReal:array[0..1,0..3] of double;
MImag:array[0..0] of double;
begin
Matlab:=CreateOleObject('matlab.application');
MatLab.Execute('a = [1 2 3 4 ; 5 6 7 8;]');
//将Matlab总的a数组赋值该Delphi数组MReal和MImag
MatLab.GetFullMatrix('a','base',MReal,MImag);
end;
end.


调试时光标停在
MatLab.GetFullMatrix('a','base',MReal,MImag);
处报错,说是参数MReal和MImag类型不对。
我查了一下在matlab/help/pdf_doc/matlab/API下的APIGUIDE.pdf文档,找到了
GetFullMatrix的原始定义(C语言格式):
void GetFullMatrix([in] BSTR Name,
[in] BSTR Workspace,
[in, out] SAFEARRAY(double)* pr,
[in, out] SAFEARRAY(double)* pi);

及它的VB示例程序:
Dim MatLab As Object
Dim Result As String
Dim MReal(1, 3) As Double
Dim MImag() As Double
Dim RealValue As Double
Dim i, j As Integer
rem We assume that the connection to MATLAB exists.
Result = MatLab.Execute("a = [1 2 3 4; 5 6 7 8;]")
Call MatLab.GetFullMatrix("a", "base", MReal, MImag)
For i = 0 To 1
For j = 0 To 3
RealValue = MReal(i, j)
Next j
Next i

我试了一下,这段VB程序可以正常运行。

在Delphi中应该怎样定义MReal,MImag呢?

我试了很多方法还是不行。望各位大侠帮帮我!

 
换成指针试一下,仅仅是个建议!
另外你的第二个树组的定义我看也有问题
 
Mimag一定要定义长度.
如果用delphi3可定义动态数组
type
MImag=array[0..0] of double
PMimag=^Mimag;
但需要分配内存getmem(PMimag,3*sizeof(double));// 3为长度
用完后释放freemem(PMimag,3*sizeof(double));

delphi4下用:
var
Mimag: array of double;
使用前要分配内存 SetLength(Mimag,3);用完后释放Mimag:=nil;

 
接受答案了.
 
我运行此句:
MatLab.GetFullMatrix('a','base',MReal,MImag);
错误:type not allowed in OLE automatin call
why?
 
我想采用的方式是:在Matlab中编制函数,生成动态连接库,在Delphi中调用,将Matlab中
有关的Dll和你的程序打包,使得你的程序独立于Matlab运行。
这种方式是否可行?如果可行,如何实现?
 
朋友,您应该参考DELPHI7中的variants类,然后在要使用的单元中加入activex,variants,comobj三个单元,再试试,呵呵!
var

V : Variant;
MReal : OleVariant;
MImage : OleVariant;

begin
i,j : integer;

MReal := VarArrayCreate([0, 1, 0, 3], varDouble);
MImage := VarArrayCreate([0,0,0,0], varDouble);

V := CreateOLEObject('Matlab.Application');
V.Execute('a=[1 2 3 4; 5 6 7 8]');
V.GetFullMatrix('a','base',VarArrayRef(MReal),VararrayRef(MImage));
for i := 0 to 1 do
for j := 0 to 3 do
Stringgrid1.Cells[j,i] := MReal[i,j];

V.Execute('peaks');

MReal := VarArrayCreate([0, 1, 0, 3], varDouble);
MImage := VarArrayCreate([0,0,0,0], varDouble);

for i := 0 to 1 do
for j := 0 to 3 do
MReal[i,j] := i+4;

V.PutFullmatrix('b','base',VarArrayRef(MReal),VararrayRef(MImage));

end
 
后退
顶部