![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi и MathLab [D5, Win2k, WinXP]
BlackFox © (2005-01-24 11:40:00)Всем привет! возникла проблема подключения матлаба к Делфи. Из делфи необходимо открывать матлаб и пердавать в него необходимые значения. Полученные значения необходимо возвращать в делфи.
Как подступиться к вопросу? Подкажите, плиз!
заранее спасибо!
reonid (2005-01-24 15:10:00) [1]Нет, не пробовал.
ghg (2005-01-24 14:48:00) [2]а ты пытался создать в матлабе COM объект или DLL и потом его юзать? У меня не получалось даже простейшие примеры из help откомпилить в matlab-е.
просто ну очень не охота чтобы был обязательно установлен matlab. Таскать с собой набор dll это куда ни шло, но весь матлаб ...
reonid (2005-01-24 14:40:00) [3]>ghg © (24.01.05 13:47) [6]
Безусловно.
ghg (2005-01-24 13:47:00) [4]>reonid
в твоем способе что нужно с собой таскать вместе с прогой чтобы все работало?
matlab должен быть установлен?
ghg (2005-01-24 13:42:00) [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');
BlackFox (2005-01-24 13:39:00) [6]>reonid
Спасибо большое!!
BlackFox (2005-01-24 12:56:00) [7]to reonid
СПАСИБО огромное!!! ща буду пытаться :)
BlackFox (2005-01-24 12:48:00) [8]to reonid
Огромное спасибо!!!!! Ща буду пробовать!!!
reonid (2005-01-24 12:16:00) [9]Модулю неделя от роду.
Сыроват, но вроде работает,
по крайней мере с 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;