Odată mi-a tras-o pe dracu ca să-l fac în Matlabe 6.5. A trecut prin program timp de 6-7 luni, aproape tot ce dorea sa dovedit, șurubul a căzut și a pierdut totul. Dar există multe impresii pe care le pot împărtăși.
1. Am scris o cerere independentă în Delphi pentru că lucrez mai bine în ea. Dar am regretat că nu cunosc C ++, deoarece Matlab este în mod clar orientat spre el și compilează toate funcțiile prin codul C.
2. Cea mai ușoară modalitate este de a compila funcțiile Matlab necesare într-un DLL, care este apoi conectat la o shell făcute uman în Delphi, de exemplu.
4. Când transferați programul pe alt computer, nu distrageți spațiul pe disc. Transferați toate DLL-urile MALALAB pe care le veți găsi (în cazul meu era vorba de aproximativ 80 MB). Dacă cel puțin o funcție nu o găsește - zboară fără avertizare în cel mai neașteptat moment.
Probabil că este vorba de toate. Voi adăuga doar că hemoroizii nu sunt slabi. Deși poate cu al șaptelea într-un mod diferit.
Mult noroc.
compilație de compilatorul intern MatLab
dragă,
spune-mi, te rog pas cu pas cum sa faci dll-ku dintr-un fisier m in MatLab-e
Cu siguranta primesc fisierul add.dll
aici numindu-l doar după această linie
a = adăugarea (b, c) unde b și c sunt, desigur, deja definite, mă pricep
mesaj
---------------------------------------------------------------
Punctul de intrare al fișierului Mp lipseste. Verificați dacă este (sensibil la minuscule)
ortografie a mexFunction (pentru fișierele C MEX), sau (insensibil pentru caractere)
ortografierea MEXFUNCTION (pentru FORTRAN MEX-files).
. Fișier MEX nevalid "C: \ my_doc \ matlab \ adding.dll": modulul specificat nu a putut fi găsit.
---------------------------------------------------------------
unde a săpat câinele?
poate nu face ceva. spune-mi?
Apropo în dogonku încă o întrebare.
dacă compilez funcția normală în matbal și stochez-o ca dll-ku, va funcționa mai repede?
dacă compilez funcția normală în matbal și stochez-o ca dll-ku, va funcționa mai repede?
În ceea ce privește toate anterior nu voi spune - doar a făcut dll-ki, eu sunt aranjate de obicei, cod și așa, dar asta e despre viteza de citire undeva (probabil undeva în help-e) care, da, puteți obține o accelerare semnificativă de lucru, mai ales dacă funcțiile compilate conțin multe bucle.
Ei bine, timpul spune ca viteza ar trebui sa creasca ca este exact necesar sa faci dll-ku.
Spune-mi pliz!
Ei bine, timpul spune ca viteza ar trebui sa creasca ca este exact necesar sa faci dll-ku.
Probleme cu viteza? - Cu funcții încorporate, cum ar fi eig (), nu câștigi viteză. Principalele motive ale încetinirii în MATLAB, cu care am dat seama:
1) schimbarea dinamica a lungimii de matrice - poate fi depășită dacă știți lungimea finală a șirului: doar începutul pentru a inițializa dimensiunea matrice pe care doriți, de exemplu, folosind zerouri () sau poate ()
2) desene grafice complexe într-un număr mare - dar apoi creați un DLL este puțin probabil să ajute
3) o abundență de cicluri - încercați să utilizați munca cu mese în loc de cicluri ori de câte ori este posibil
Dacă codul este corect construit, atunci a) poate exista o nevoie acută de accelerare suplimentară; b) crearea de dll nu va da acest efect.
cu primele două - fără probleme.
variabilele sunt create în avans și în acest fel dimensiunea lor nu se schimbă.
dar cu asta.
o abundenta de cicluri - incercati sa folositi munca cu mese in loc de cicluri ori de cate ori este posibil
cumva până când nu se împarte
pentru k = 1: z;
sh_x = vector (1) * k-1;
sh_y = vect (2) * k-1;
i = ceil (shift_x-sh_x);
j = plafon (shift_y-sh_y);
di = abs (i- (schimbare_x-sh_x));
dj = abs (j- (shift_y-sh_y));
[XI, YI] = meshgrid (1 + di: 1: dimensiune (data1,1), 1 + dj: 1: dimensiunea (data1,2));
[si, sj] = dimensiunea (XI);
ZI = interp2 (X, Y, date1 (.20), XI, YI);
int_data (i: i + si-1, j: j + sj-1) = int_data (i: i +-si 1, j: j + sj-1) + dublu (ZI);
rulează de trei ori mai lent decât codul
============================================
data1 = dublu (date1);
pentru k = 1: z;
sh_x = vect (1) * k;
sh_y = vect (2) * k;
pentru i = 1: dimensiune (int_data, 1);
ii = i + sh_x-shift_x;
dacă (ii> = 2 ii<=x-1);
iir = rotund (i + sh_x-shift_x);
iif = podea (i + sh_x-shift_x);
iic = plafon (i + sh_x-shift_x);
pentru j = 1: dimensiune (int_data, 2);
jj = j + sh_y-shift_y;
dacă (jj> = 2 jj<=y-1);
jjr = rotundă (j + sh_y-shift_y);
jjf = podea (j + sh_y-shift_y);
jjc = ceil (j + sh_y-shift_y);
ad_x1y1 = date1 (iif, jjf, k);
ad_x1y2 = date1 (iif, jjc, k);
ad_x2y1 = date1 (iic, jjf, k);
ad_x2y2 = date1 (iic, jjc, k);
ad_y1 = ad_x1y1 + (ii-iif) * (ad_x1y2-ad_x1y1);
ad_y2 = ad_x2y1 + (ii-iif) * (ad_x2y2-ad_x2y1);
int_data (i, j) = int_data (i, j) + anunț;
% Int_data (i, 1 + ceil (shift_y-sh_y) :( ceil (shift_y-sh_y) + dimensiune (ad, 2))) = int_data (i, 1 + ceil (shift_y-sh_y) :( ceil (shift_y-sh_y ) + dimensiune (ad, 2))) + dublu (ad);
capăt
capăt
capăt
capăt
% [num2str (k), "cicluri out", num2str (z), "done"]
capăt
=======================
Deși prima utilizează doar un singur ciclu și două funcții standard
iar al doilea efectuează o căutare element-cu-element și utilizează pentru aceste 3 bucle imbricate.
unde a săpat câinele?