Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Delphi и MathLab   Найти похожие ветки 

 
BlackFox   (2005-01-24 11:40) [0]

Всем привет! возникла проблема подключения матлаба к Делфи. Из делфи необходимо открывать матлаб и пердавать в него необходимые значения. Полученные значения необходимо возвращать в делфи.
Как подступиться к вопросу?  Подкажите, плиз!
заранее спасибо!


 
reonid ©   (2005-01-24 12:16) [1]

Модулю неделя от роду.
Сыроват, но вроде работает,
по крайней мере с Workspace = "base".
D7, M6.5

// --------------- MatCom.pas ---------------------

unit MatCom;

interface

uses
 Classes, Variants, VarUtils, ComObj, ActiveX;

// Workspace: base global caller

type
 TMatrixSize = packed record
   N1, N2: Integer;
 end;

 TVarMatrix = record
   Re, Im: Variant;
 end;

 TMatlabComServer = class(TComponent)
 private
   FMServer: Variant;
 //protected
 public
   procedure _GetMatrix(const AName: string; var AMatrix: TVarMatrix;
     M, N: Integer; RealOnly: Boolean);

   function _GetValue(const AName: string): Double;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;

   function IsChar(const AName: string): Boolean;
   function IsValue(const AName: string): Boolean;

   procedure GetMatrix(const AName: string; var AMatrix: TVarMatrix);
   procedure PutMatrix(const AName: string; const AMatrix: TVarMatrix);

   function GetValue(const AName: string): Double;
   procedure PutValue(const AName: string; AValue: Double);

   function GetString(const AName: string): string;
   procedure PutString(const AName, AValue: string);

   function GetMatrixSize(const AName: string): TMatrixSize;

   procedure Execute(const ACommand: string);
 end;

 function CreateVarMatrix(M, N: Integer; RealOnly: Boolean): TVarMatrix;

implementation

uses
 SysUtils;

function CreateVarMatrix(M, N: Integer; RealOnly: Boolean): TVarMatrix;
begin
 Result.Re := VarArrayCreate([0, M-1, 0, N-1], varDouble);

 if RealOnly
   then Result.Im := VarArrayCreate([0, 0, 0, 0], varDouble)
   else Result.Im := VarArrayCreate([0, M-1, 0, N-1], varDouble);
end;

function ExtractWorkspace(const AQualifiedName: string): string;
var p: Integer;
begin
 Result := "base"; // Default workspace
 p := Pos("::", AQualifiedName);
 if p > 0 then Result := Copy(AQualifiedName, 1, p-1);
end;

function ExtractName(const AQualifiedName: string): string;
var p: Integer;
begin
 Result := AQualifiedName;
 p := Pos("::", AQualifiedName);
 if p > 0 then Result := Copy(AQualifiedName, p+2, Length(AQualifiedName)-p-1);
end;

{----------------------------- TMatlabComServer -------------------------------}

constructor TMatlabComServer.Create(AOwner: TComponent);
begin
 inherited;
 FMServer := CreateOleObject("Matlab.Application");
end;

destructor TMatlabComServer.Destroy;
begin
 FMServer.Quit;
 inherited;
end;

procedure TMatlabComServer._GetMatrix(const AName: string;
 var AMatrix: TVarMatrix; M, N: Integer; RealOnly: Boolean);
begin
 AMatrix := CreateVarMatrix(M, N, RealOnly);
 FMServer.GetFullMatrix(
   ExtractName(AName),
   ExtractWorkspace(AName),
   VarArrayRef(AMatrix.Re),
   VarArrayRef(AMatrix.Im));
end;

procedure TMatlabComServer.PutMatrix(const AName: string;
 const AMatrix: TVarMatrix);
begin
 FMServer.PutFullMatrix(
   ExtractName(AName),
   ExtractWorkspace(AName),
   VarArrayRef(AMatrix.Re),
   VarArrayRef(AMatrix.Im));
end;

procedure TMatlabComServer.GetMatrix(const AName: string;
 var AMatrix: TVarMatrix);
var s: TMatrixSize;
begin
 s := GetMatrixSize(AName);
 _GetMatrix(AName, AMatrix, s.N1, s.N2, False);
end;

procedure TMatlabComServer.Execute(const ACommand: string);
begin
 FMServer.Execute(ACommand);
end;

function TMatlabComServer._GetValue(const AName: string): Double;
var Matrix: TVarMatrix;
begin
 Matrix := CreateVarMatrix(1, 1, True);
 _GetMatrix(AName, Matrix, 1, 1, True);
 Result := Matrix.Re[0, 0];
end;

procedure TMatlabComServer.PutValue(const AName: string; AValue: Double);
var Matrix: TVarMatrix;
begin
 Matrix.Re := VarArrayCreate([0, 0, 0, 0], varDouble);
 Matrix.Im := VarArrayCreate([0, 0, 0, 0], varDouble);
 Matrix.Re[0, 0] := AValue;
 Matrix.Im[0, 0] := 0;
 PutMatrix(AName, Matrix);
end;

function TMatlabComServer.GetMatrixSize(const AName: string): TMatrixSize;
begin
 //Execute(Format("test_ans1 = size(%s, 1)", [AName]));
 //Execute(Format("test_ans2 = size(%s, 2)", [AName]));

 Execute(Format("test_ans1 = evalin(""%s"",""size(%s, 1)"");", [ExtractWorkspace(AName), ExtractName(AName)]));
 Execute(Format("test_ans2 = evalin(""%s"",""size(%s, 2)"");", [ExtractWorkspace(AName), ExtractName(AName)]));

 Result.N1 := Round( _GetValue("test_ans1") );
 Result.N2 := Round( _GetValue("test_ans2") );
end;

function TMatlabComServer.IsChar(const AName: string): Boolean;
begin
 //Execute(Format("test_ans1 = ischar(%s)", [AName]));

 Execute(Format("test_ans1 = evalin(""%s"",""ischar(%s)"");", [ExtractWorkspace(AName), ExtractName(AName)]));
 Result := _GetValue("test_ans1") > 0;
end;

function TMatlabComServer.IsValue(const AName: string): Boolean;
var sz: TMatrixSize;
begin
 sz := GetMatrixSize(AName);
 Result := (sz.N1 = 1)and(sz.N2 = 1);
end;

function TMatlabComServer.GetString(const AName: string): string;
var Str: Variant;
begin
 if IsChar(AName) and (GetMatrixSize(AName).N1 = 1) then
 begin
   Str := FMServer.GetCharArray(ExtractName(AName), ExtractWorkspace(AName));
   Result := Str;
 end else
   raise Exception.Create("string arrays are not supported yet");
end;

procedure TMatlabComServer.PutString(const AName, AValue: string);
begin
 FMServer.PutCharArray(ExtractName(AName), ExtractWorkspace(AName), AValue);
end;

function TMatlabComServer.GetValue(const AName: string): Double;
begin
 if IsValue(AName)
   then Result := _GetValue(AName)
   else raise Exception.CreateFmt("%s is not a simple value", [AName]);
end;

end.

// ---------------- Использование -----------------
procedure TForm1.FormCreate(Sender: TObject);
var
   MatlabServer: TMatlabComServer;
   Mat, Mat2: TVarMatrix;
   i, j, N: Integer;
   v: Double;

 
begin
   MatlabServer := TMatlabComServer.Create(Self);

   N := 5;
   Mat := CreateVarMatrix(N, N, True);
   for i := 0 to N-1 do
     for j := 0 to N-1 do
     begin
       Mat.Re[i, j] := 1;
       Mat.Im[i, j] := 0;
     end;
   
   // Передача данных в матлаб
   MatlabServer.PutMatrix("MyMatrix", Mat);
   MatlabServer.Execute("MyMatrix3 = [1 2 3; 4 5 6; 7 8 9];");
   MatlabServer.PutValue("MyValue", 3.14);

   // Получение данных из матлаба
   MatlabServer.GetMatrix("MyMatrix2", Mat2);
   v := MatlabServer.GetValue("MyMatrix2");

end;


 
BlackFox   (2005-01-24 12:48) [2]

to reonid
Огромное спасибо!!!!! Ща буду пробовать!!!


 
BlackFox   (2005-01-24 12:56) [3]

to reonid
СПАСИБО огромное!!!  ща буду пытаться  :)


 
BlackFox   (2005-01-24 13:39) [4]

>reonid
Спасибо большое!!


 
ghg ©   (2005-01-24 13:42) [5]

я делал намного проще

в файл загонял данные
запускал из Delphi-ей matlab
и оттуда же их забирал

 if FindWindow(nil, "MATLAB Command Window") <> null then
   V := CreateOLEObject("Matlab.application");
 V.Execute("load " + s + "semp.map");
 V.Execute("то что нужно писать в командной строке матлаба");
 V.Execute("save " + s + "smooth1.map C1 -ascii");


 
ghg ©   (2005-01-24 13:47) [6]

>reonid
в твоем способе что нужно с собой таскать вместе с прогой чтобы все работало?
matlab должен быть установлен?


 
reonid ©   (2005-01-24 14:40) [7]

>ghg ©   (24.01.05 13:47) [6]
Безусловно.


 
ghg ©   (2005-01-24 14:48) [8]

а ты пытался создать в матлабе COM объект или DLL и потом его юзать? У меня не получалось даже простейшие примеры из help откомпилить в matlab-е.
просто ну очень не охота чтобы был обязательно установлен matlab. Таскать с собой набор dll это куда ни шло, но весь матлаб ...


 
reonid ©   (2005-01-24 15:10) [9]

Нет, не пробовал.



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
10-1082362359
7th_Angel
2004-04-19 12:12
2005.02.06
Диаграммы в Excel


1-1106300946
GH@ST
2005-01-21 12:49
2005.02.06
КАк убрать ковычку из строки?


1-1106243907
Dmitry_04
2005-01-20 20:58
2005.02.06
Как отловить событие на то, что компъютер выйдет из интернета?


4-1103283927
__Vic
2004-12-17 14:45
2005.02.06
Путь к каталогу (файлу)


14-1106207207
guest_Dmitry
2005-01-20 10:46
2005.02.06
Процедуры в IB