Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.072 c
1-1106408303
kyn66
2005-01-22 18:38
2005.02.06
Как установить EasyTable 6.03 D6


1-1106418295
MadGhost
2005-01-22 21:24
2005.02.06
Как динамически создать на форме TLabel TEdit и другие компоненты


14-1106207042
Aleksandr_666
2005-01-20 10:44
2005.02.06
bde


1-1105967375
tolstiak
2005-01-17 16:09
2005.02.06
В TEdit - одни цифры и ОДНА запятая?


14-1105739482
Ломброзо
2005-01-15 00:51
2005.02.06
Экскурс в Java





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский