Одного разу смикнув мене чорт зробити подібне в Matlabe 6.5. Потів над прогой місяці 6-7, вийшло майже все що хотів, посипався гвинт і все втратив. Але залишилося безліч вражень, якими можу поділитися.
1. Незалежне додаток я писав в Delphi тому як краще в ньому працюю. Але шкодував що не знаю С ++, так як Matlab чітко орієнтований на нього і компілює всі функції через код Сі.
2. Найпростіше необхідні матлабовскіе функції скомпілювати в DLL, яку потім підключати до оболонки, зробленої по-людськи в Delphi, наприклад.
4. При перенесенні програми на інший комп'ютер не варто скупитися на місце на диску. Перенесіть всі матлабовскіе DLL-ки які знайдете (в моєму випадку це було близько 80-ти Мб). Якщо хоч якийсь функції він не знаходить - вилітає без попередження в найнесподіваніший момент.
Ну ось мабуть і все. Додам тільки, що геморой це не слабкий. Хоча може з сьомим по-іншому.
Успіхів.
компіляція внутрішнім компілятором MatLab
шановні,
підкажіть будь ласка покроково як зробити dll-ку з m-файлу в MatLab-e
я звичайно отримую файл adding.dll
ось тільки викликаючи його після цього рядком
a = adding (b, c) де b і c звичайно ж вже визначені я отримую
повідомлення
---------------------------------------------------------------
Mex file entry point is missing. Please check the (case-sensitive)
spelling of mexFunction (for C MEX-files), or the (case-insensitive)
spelling of MEXFUNCTION (for FORTRAN MEX-files).
. Invalid MEX-file 'C: \ my_doc \ matlab \ adding.dll': The specified module could not be found.
---------------------------------------------------------------
де собака порилася?
може чогось не так роблю. підкажіть?
до речі в догонку ще одні питання.
якщо я звичайну функцію в матбале відкомпілюйте і збережу як dll-ку то чи буде вона швидше працювати?
якщо я звичайну функцію в матбале відкомпілюйте і збережу як dll-ку то чи буде вона швидше працювати?
З приводу всього попереднього не скажу - просто не робив dll-ки, мене зазвичай влаштовував код і так, а ось про швидкість десь читав (можливо, навіть десь в help-е), що так, можна отримати значне прискорення в роботі, особливо, якщо компільовані функції містять багато циклів.
ну раз говорите швидкість повинна збільшитися то точно треба робити dll-ку.
підкажіть плиз!
ну раз говорите швидкість повинна збільшитися то точно треба робити dll-ку.
Проблеми зі швидкістю? - З вбудованими функціями, типу eig () Ви не виграєте в швидкості. Основні причини уповільнення роботи в MATLAB з якими я стикався:
1) динамічна зміна довжини масиву - можна побороти, якщо Вам відома кінцева довжина масиву: просто спочатку Ініціалізуйте масив потрібного Вам розміру, наприклад використовуючи функції zeros () або ones ()
2) промальовування складних графіків у великій кількості - але тут Вам створення dll навряд чи допоможе
3) велика кількість циклів - постарайтеся використовувати роботу з масивами замість циклів всюди, де це можливо
Якщо грамотно побудувати код, то потім а) може відпасти гостра необхідність в подальшому прискоренні; б) створення dll вже не дасть того ефекту.
з першими двома - проблем немає.
змінні створюються заздалегідь і в процесі їх розмір не менят.
а ось з цим.
велика кількість циклів - постарайтеся використовувати роботу з масивами замість циклів всюди, де це можливо
як-то поки не зростається
for k = 1: z;
sh_x = vect (1) * k-1;
sh_y = vect (2) * k-1;
i = ceil (shift_x-sh_x);
j = ceil (shift_y-sh_y);
di = abs (i- (shift_x-sh_x));
dj = abs (j- (shift_y-sh_y));
[XI, YI] = meshgrid (1 + di: 1: size (data1,1), 1 + dj: 1: size (data1,2));
[Si, sj] = size (XI);
ZI = interp2 (X, Y, data1 (. 20), XI, YI);
int_data (i: i + si-1, j: j + sj-1) = int_data (i: i + si-1, j: j + sj-1) + double (ZI);
працює в три рази повільніше коду
============================================
data1 = double (data1);
for k = 1: z;
sh_x = vect (1) * k;
sh_y = vect (2) * k;
for i = 1: size (int_data, 1);
ii = i + sh_x-shift_x;
if (ii> = 2 ii<=x-1);
iir = round (i + sh_x-shift_x);
iif = floor (i + sh_x-shift_x);
iic = ceil (i + sh_x-shift_x);
for j = 1: size (int_data, 2);
jj = j + sh_y-shift_y;
if (jj> = 2 jj<=y-1);
jjr = round (j + sh_y-shift_y);
jjf = floor (j + sh_y-shift_y);
jjc = ceil (j + sh_y-shift_y);
ad_x1y1 = data1 (iif, jjf, k);
ad_x1y2 = data1 (iif, jjc, k);
ad_x2y1 = data1 (iic, jjf, k);
ad_x2y2 = data1 (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) + ad;
% Int_data (i, 1 + ceil (shift_y-sh_y) :( ceil (shift_y-sh_y) + size (ad, 2))) = int_data (i, 1 + ceil (shift_y-sh_y) :( ceil (shift_y-sh_y ) + size (ad, 2))) + double (ad);
end
end
end
end
% [Num2str (k), 'cycles out of', num2str (z), 'is done']
end
=======================
хоча перший використовує всього один цикл і дві стандартні функції
а другий робить поелементний перебір масиву і використовує для цього 3 вкладених циклу.
де собака порилася?