Текущий архив: 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.48 MB
Время: 0.03 c