2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Создание независимого приложения в Matlab 7.01
Сообщение08.01.2007, 18:58 
Как можно сделать независимое приложение в Matlab 7.01 так, чтобы оно запускалось на другом компьютере, на котором ни matlab, ни компилятор не установлен?

Заранее спасибо!

 
 
 
 
Сообщение13.02.2007, 00:07 
Однажды дернул меня черт сделать подобное в Matlabe 6.5. Потел над прогой месяца 6-7, получилось почти все что хотел, посыпался винт и все потерял :cry: . Но осталось множество впечатлений, которыми могу поделиться.

1. Независимое приложение я писал в Delphi потому как лучше в нем работаю. Но сожалел что не знаю С++, так как Matlab четко ориентирован на него и компилирует все функции через код Си.

2. Проще всего необходимые матлабовские функции скомпилировать в DLL, которую затем подключать к оболочке, сделанной по-человечески в Delphi, например.

3. При подключении DLL-ки к интерфейсной программе важно понять в каком виде Matlab хранит переменные. Это ссылка на запись, в которой хранится размерность массива и ссылка на сам массив.

4. При переносе программы на другой компьютер не стоит скупиться на место на диске. Перенесите все матлабовские DLL-ки какие найдете (в моем случае это было около 80-ти Мб). Если хоть какой-то функции он не находит - вылетает без предупреждения в самый неожиданный момент.

Ну вот пожалуй и все. Добавлю только, что геморой это не слабый. Хотя может с седьмым по-другому.
Успехов.

 
 
 
 компиляция внутренним компилятором MatLab
Сообщение02.10.2007, 16:29 
уважаемые,
подскажите пожалуйста пошагово как сделать dll-ку из m-файла в MatLab-e

просто написав функцию типа
=====================
function [a]=adding(b,c)
a=b+c;
=====================
и запустив

mcc -l adding.m

я конечно получаю файл 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-ку то будет ли она быстрее работать?

 
 
 
 
Сообщение02.10.2007, 19:28 
Аватара пользователя
xalexis писал(а):
если я обычную функцию в матбале откомпилирую и сохраню как dll-ку то будет ли она быстрее работать?

По поводу всего предыдущего не скажу - просто не делал dll-ки, меня обычно устраивал код и так, а вот про скорость где-то читал (возможно, даже где-то в help-е), что да, можно получить значительное ускорение в работе, особенно, если компилируемые функции содержат много циклов.

 
 
 
 
Сообщение03.10.2007, 00:07 
ну раз говорите скорость должна увеличиться то точно надо делать dll-ку.
подскажите плиз!

 
 
 
 
Сообщение03.10.2007, 10:12 
Аватара пользователя
xalexis писал(а):
ну раз говорите скорость должна увеличиться то точно надо делать dll-ку.

Проблемы со скоростью? - Со встроенными функциями, типа eig() Вы не выгадаете в скорости. Основные причины замедления работы в MATLAB с которыми я сталкивался:
1) динамическое изменение длины массива - можно побороть, если Вам известна конечная длина массива: просто изначально инициализируйте массив нужного Вам размера, например используя функции zeros() или ones()
2) прорисовка сложных графиков в большом количестве - но тут Вам создание dll вряд ли поможет
3) обилие циклов - постарайтесь использовать работу с массивами вместо циклов везде, где это возможно

Если грамотно построить код, то потом а) может отпасть острая необходимость в дальнейшем ускорении; б) создание dll уже не даст того эффекта.

 
 
 
 
Сообщение03.10.2007, 11:06 
с первыми двумя - проблем нет.
переменные создаются заранее и в процессе их размер не менятеся.
а вот с этим.
Цитата:
обилие циклов - постарайтесь использовать работу с массивами вместо циклов везде, где это возможно

как-то пока не сростается

а в частности
код
===========================================
data1=double(data1);
[X,Y]=meshgrid(1:1:size(data1,1),1:1:size(data1,2));

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);

end
===========================================

работает в три раза медленнее кода

============================================
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);

ad=ad_y1+(jj-jjf)*(ad_y2-ad_y1);

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 вложенных цикла.

где собака порылась?

 
 
 
 
Сообщение04.10.2007, 12:52 
Аватара пользователя
xalexis писал(а):
хотя первый использует всего один цикл и две стандартные функции
а второй делает поэлементный перебор массива и использует для этого 3 вложенных цикла.

где собака порылась?

попробуйте прогнать через профайлер - посмотрите, где теряется время; думаю, что теряете на meshgrid()

 
 
 
 
Сообщение05.10.2007, 05:05 
отработал тему с dll в Matlab 6.5/ хочется отметить, что в Matlab dll - всего лишь расширение файла, никакого отношения к динамическим библиотекам она не имеет и называется MEX функцией. компилится она командой ( mcc -x filename ). тут mcc - Matlab C Compiler - драйвер который управляет процессом компиляции, дополнительно нужно установить и настроить необходимый компилятор командой ( mex -setup ). если говорить про ( -x ) - это пользовательский ключ который указывает на операцию с MEX. реально, в mexopts.bat валяется его длинная интерпретиция, у кого есть желание можете пользоваться профессионально и сконфигурить батник.

 
 
 
 exe-файлы из MatLab
Сообщение20.03.2008, 18:48 
Здравствуйте!!!

Меня интересует, можно ли генерировать exe-файлы из MatLab, как это делается, например, из Delphi?

С уважением,

Dmitry

 
 
 
 
Сообщение20.03.2008, 20:00 
Код:
doc mcc

 
 
 
 
Сообщение25.03.2008, 08:54 
Здравствуйте!
Уважаемые пользователи, подскажите пожалуйста можно ли создать exe файл в Matlab способный работать на ПК без самого Matlab.
doc mcc
это конечно хорошо, но может кто-нибуть ответить можно ли в matlab 2006a сделать независимый exe. Т.к. получается сделать сделать только работающий на ПК, где matlab уже установлен. Программа сделана через GUIDE и содержит *.m и *.fig файлы.

 
 
 
 
Сообщение25.03.2008, 11:08 
Сделайте статическую линковку библиотек.

 
 
 
 Re: компиляция внутренним компилятором MatLab
Сообщение23.03.2011, 19:32 
исходя из doc mcc
я написал: mcc -t -T link:lib onestepahead
Очень хотелось получить DLL, пригодную для использования совершенно другой программой
но в ответ получаю:
"impossible to open _lib2067.def"

Действительно, такого файла у меня нет.

Подскажите, пожалуйста, что делать!
Может у кого-нибудь есть этот файл?

Его можно поискать, например: в ":\MATLAB_6p5\extern\include\"

А вообще-то должен ещё где-то быть официальный склад матлабовских файлов...
Подскажите где.

 
 
 
 Re:
Сообщение24.03.2011, 15:55 
Владимир_81 в сообщении #108680 писал(а):
Здравствуйте!
Уважаемые пользователи, подскажите пожалуйста можно ли создать exe файл в Matlab способный работать на ПК без самого Matlab.
doc mcc
это конечно хорошо, но может кто-нибуть ответить можно ли в matlab 2006a сделать независимый exe. Т.к. получается сделать сделать только работающий на ПК, где matlab уже установлен. Программа сделана через GUIDE и содержит *.m и *.fig файлы.


Я использую:
mcc - И -sgl {имя файла}
получается exe файл.
Для нормальной работы на другом компе без матлаба нужны библиотеки Run-Time (реального времени) MCRInstaller.exe. Обычно идет вместе с матлабом.
Т.е. на компе на котором нет матлаба ставят библиотека и запускают программу exe. Для нормальной работы нужны несколько файлов (если не ошибаюсь сам exe и ctf, но это можно установить экспериментальным путем). По крайней мере у меня так работает.
Аналогично я делаю для программирование в Delphi, делаю программу в matlabe, делаю exe и в delphi выполняю программу эту exe.

 
 
 [ Сообщений: 17 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group