Форум программистов, компьютерный форум, киберфорум
Наши страницы
Matlab
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/466: Рейтинг темы: голосов - 466, средняя оценка - 4.61
lomt
449 / 275 / 13
Регистрация: 13.11.2012
Сообщений: 589
Записей в блоге: 1
1

Создание exe файла в MatLab

01.07.2013, 15:28. Просмотров 84890. Ответов 140
Метки нет (Все метки)

Много раз народ спрашивал, как сделать exe файл в MatLab и возможно ли запустить свою программу, не используя сам MatLab. Привожу простенький метод создания экзешников.

Для теста я взял программу подсчёта полож/отриц/нулей среди задаваемых чисел с простейшим интерфейсом.
Создание exe файла в MatLab
)
Оформляем наш код как функцию и запускаем deploytool, во всплывающем окне выбираем стандартное приложение Windows и вводим название нашего проекта.
Создание exe файла в MatLab

Открывается наш проект. Здесь в поле main мы располагаем наш главный файл(функцию). В поле
вспомогательных файлов помещаются файлы с данными, к которым обращается программа, GUI файлы, функции, к которым в течение работы обращается главная программа или функции, не находящиеся в нужной директории, а также коды на C/C++, которые вы хотите скомпилировать и использовать в дальнейшем в вашем приложении. В нашем случаи есть только исполняющий файл-функция, поэтому это поле остаётся пустым.
Создание exe файла в MatLab

В разделе Package к стандартным создаваемым файлам добавляем установку MCR (MATLAB Component Runtime). Это полный набор dll-библиотек для поддержки работы языка MatLab. Для этого жмём на Add MCR и выбираем встраивание библиотек в пакет.
Создание exe файла в MatLab

Теперь создаём наш составленный проект, нажимая на кнопку Build, а потом создаем пакет вспомогательных файлов, нажимая на кнопку Package. После этого в исходной папке появится файл с разрешением .prj и установочный экзешник для библиотек.
Создание exe файла в MatLab

Запускаем экзешник и после разархивирования устанавливаем MCR.
Создание exe файла в MatLab

Теперь наш экзешник окончательно готов. Для теста закрываем MatLab и запускаем программу.
Создание exe файла в MatLab

Как видно, всё прекрасно работает. Добавлю, что созданный нами exe можно запускать и на компьютерах, где не установлен сам MatLab. Для этого требуется лишь установить MCR перед запуском программы. (установочный файл находится в папке проекта).
Код файл-функции:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function  Proga
clear all;close all;
name_peremennie={'Переменная 1:','Переменная 2:','Переменная 3:','Переменная 4:'};
peremennie_initial={'0','0','0','0'};
options.Resize='on';
options.WindowStyle='normal';
options.Interpreter='none';
Peremennie=inputdlg(name_peremennie,'Ввод переменных',1,peremennie_initial,options);
Pos_num=0;
Neg_num=0;
Zero_num=0;
for i=1:length(Peremennie)
    A(i)=str2num(Peremennie{i});
    if A(i)==0
        Zero_num=Zero_num+1;
    else
        if A(i)>0
          Pos_num=Pos_num+1;
        else
           Neg_num=Neg_num+1;
        end
    end
end
Answer1=cat(2,'Количество положительных переменных равно ',num2str(Pos_num));
Answer2=cat(2,'Количество отрицательный ',num2str(Neg_num));
Answer3=cat(2,'Количество нулей ',num2str(Zero_num));
msgbox({Answer1,Answer2,Answer3},'Ответ');
end
11
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2013, 15:28
Ответы с готовыми решениями:

Matlab gui открытие exe файла в программе
Такая роблема, когда откраваешь в .m файле то он запускает эти exe, но когда...

Создание exe файла
Подскажите,пожалуйста,как мне из созданного в Guide приложения создать ехе?...

Создание exe файла
Здравствуйте! Прочитал тему "Создание exe файла в MatLab", решил попробовать....

Создание exe-файла из GUI (GUIDE) приложения
В архиве форума не нашел ответ на вопрос о принципиальной возможности решения...

Exe файл matlab
Добрый вечер. На 32 разрядной системе (WinXP) стоит Matlab R2011b и студия...

140
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
31.08.2013, 02:10 41
Маньяки... 350 метров, чтобы график построить?! Существует способ иметь внутри exe старый вариант Matlab C++ Math Library, при этом можно не устанавливать и не запускать никаких инсталляторов, а просто положить нужные dll'ки рядом с exe файлом.
Кому интересно, можете заглянуть сюда: Matlab C++ Math Library. Там я использую набор файлов из Matlab 6.5, где есть около 400 матричных функций и всё это в архиве занимает 8,5 Мбайт! По ссылке на тему можно найти исходники в репозитории svn и посмотреть как это сделано.
Этой информации нет в нескольких известных книжках по теме. Я использую численную библиотеку Matlab как дополнение к SMath Studio, где теперь доступны больше сотни Matlab функций. Причем стоить заметить, что функции у меня вызываются из C# кода через специальный посредник, написанный на C++/CLI.

Ничто не мешает использовать мой приём в любой exe программе. Там есть некоторые тонкости, которые зависят от того, где вы делаете вычисления: в dll или exe. Если вы будете хранить движок матлаба внутри и при инсталляции распаковывать в определенное место, то нужно сделать так, чтобы dll'ки матлаба могли найти друг друга при загрузке. У меня это сделано без модификации переменной окружения path.

Ещё могу добавить, что можно заставить работать 32разрядный неуправляемый код, даже если он вызывается из управляемого кода на 64-разрядной машине. Поэтому эту старую RTL можно использовать и сейчас. Всё прекрасно работает и не нужно никаких левых сотней мегабайт в довесок.
0
lomt
449 / 275 / 13
Регистрация: 13.11.2012
Сообщений: 589
Записей в блоге: 1
31.08.2013, 13:41  [ТС] 42
Так это не компелирование программы через Матлаб для standalone использования получается, а прикручивание функций Матлаба через библиотеки в другие проги на других языках. С таким же успехом можно было вообще всё писать на Python, который ту же матлабовскую библиотеку юзает. А вот
Цитата Сообщение от уни Посмотреть сообщение
Маньяки... 350 метров, чтобы график построить?!
это конечно сильное заявление!
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
31.08.2013, 15:28 43
Когда вы "компилируете" такого рода m-файл, то вы неявно делаете то же самое. Никакого тайного смысла сия операция не предполагает. Просто компилятор matlab делает некоторую работу за тех, кто в ней ничего не понимает, а именно, связывает функции, которые используются в m-файле, со своими библиотеками. Вы можете проделать те же операции самостоятельно, если понимаете что к чему. Я-то как раз таки понимаю что к чему, так как читаю документацию: MATLAB C/C++ Graphics Library User's Guide.

Я о том, что можно использовать дистрибутив их старой библиотеки размером в 8,5 метров и получить практически те же результаты для простых применений, которые могут быть получены с дистрибутивом в 300 метров. Разница существенная для отдельно взятого приложения. Если я хочу использовать, к примеру, функцию fft2() из их библиотеки или численный решатель жёсткого ОДУ ode15s(), то накой чёрт мне нужны эти 300 метров в довесок? Оно прекрасно работает и со старой библиотекой.

Причём я графическими возможностями Matlab RTL в своём плагине к SMath Studio не пользуюсь, т.к. они там не нужны. У Смоленцева (книжка 2006 г.) неплохо описано подключение этой библиотеки, но он просто перевёл хороше руководство, но своего ничего не добавил. Те же примеры работы с численными решателями ОДУ в C++ программе у него отсутствуют (идут не далее одного примера из руководства).
1
Миниатюры
Создание exe файла в MatLab  
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
31.08.2013, 16:09 44
Скомпилировал я одну демку из стандартных примеров Matlab 6.5:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
function flames
%FLAMES creates an animation of the MathWorks logo rising through flames
 
%   Copyright (c) 1984-2000 by The MathWorks, Inc.
% $Revision: 1.4 $
 
figure('Menubar','None','NumberTitle','Off','Name','Demo','UserData',1);
set(gcf,'DoubleBuffer','On','Renderer','Painters','Resize','Off');
menu1 = uimenu('Label','&File');
menu2 = uimenu(menu1,'Label','E&xit');
 
%Only function calls are allowed in the C/C++ Graphics Library callbacks 
set(menu2,'Callback','set(gcf,''UserData'','''');');
 
X=[];
load flames.mat X
 
[a,b] = size(X);
x = ones(a,b)*.01;
x(end,:) = 201;
x(end-1,:) = 140;
x(end-2,:) = 60;
theImage = image(x);
set(theImage,'CDataMapping','Direct');
colormap([hot(200);[0 0 0]]);
axis off;
axis image;
set(gca,'YLim',[1 size(x,1)-2]);
set(gca,'Units','Pixels','Position',[15 15 1.5*a+30 1.5*b+30]);
theSize = get(0,'ScreenSize');
set(gcf,'Units','Pixels','Position',...
   [(theSize(3)-(1.5*a+60))/2 (theSize(4)-(1.5*b+60))/2 (1.5*a+60) (1.5*b+60)],...
   'Color',[0 0 0]);
animate_it(theImage,X);
 
%All figures must be closed for a C/C++ Graphics Library
%application to exit
close all;
 
function animate_it(theImage,theLogo);
%The algorithm used takes the last image used and based on a pixel-by-pixel
%basis deterime the next image. It uses the following rule for pixel X: that
%the new pixel value is based on the old value plus the two pixels below and 
%the two pixels two down and one to the right and left. Add in a bit of 
%randomness, normalize the matrix to one, and where ever the picture
%is 1, set that pixel to one.
 
X = get(theImage,'CData');
 
[a,b] = size(X);
 
%Pre-allocation of matricies speed up loops
theZeros = zeros(a,1);
theZeros2 = zeros(1,b);
theOnes = ones(1,b);
theRand = rand(a,b);
theLogical = [theLogo(1:end,:)];
 
%This loop causes the logo to rise.
for i = 1:a-1
   if ~isempty(get(gcf,'UserData'))
      theRand = [theRand(3:end,:);theRand(1:2,:)];
      movedUp = [X(2:end,:);theOnes];
      movedUp2 = [movedUp(2:end,:);theOnes];
      upAndLeftAndRight = ([movedUp2(:,2:end),theZeros]) + ...
         ([theZeros,movedUp2(:,1:end-1)]);
      theTemp = theRand .* X;
      X = theTemp + theTemp + movedUp + upAndLeftAndRight + movedUp2 ;
      X = X ./ max(max(X));
      X([zeros(a-i-1,b);theLogo(1:i+1,:)]==1) = 1;
      set(theImage,'CData',X.*201);
      drawnow;
   end
end
 
%This while loop just keeps cycling the flames until the window is
%closed.
while ~isempty(get(gcf,'UserData'))
   theRand = [theRand(3:end,:);theRand(1:2,:)];
   movedUp = [X(2:end,:);theOnes];
   movedUp2 = [movedUp(2:end,:);theOnes];
   upAndLeftAndRight = ([movedUp2(:,2:end),theZeros])+ ...
      ([theZeros,movedUp2(:,1:end-1)]);
   theTemp = theRand .* X;
   X = theTemp + theTemp + movedUp + upAndLeftAndRight + movedUp2 ;
   X = X ./ (max(max(X)));
   X(theLogical==1) = 1;
   set(theImage,'CData',X.*201);
   drawnow;
end
Весь набор файлов проекта, включая скомпилированный exe, занимает 200 Кбайт. Плюсуем сюда 8,5 Мбайт, итого около 9 Мбайт будет дистрибутив этой программки. Сравните это с 350 метрами. По правде сказать, получившиеся c-файлы исходника при автоматизированной трансляции не так с ходу понятны, но это только если вы транслируете m-файл. Ничто не мешает доработать файлы проекта для своего использования.
1
Изображения
 
lomt
449 / 275 / 13
Регистрация: 13.11.2012
Сообщений: 589
Записей в блоге: 1
31.08.2013, 18:27  [ТС] 45
Довольно занятно, а главное информативно, будем разбираться!

Цитата Сообщение от уни Посмотреть сообщение
Когда вы "компилируете" такого рода m-файл, то вы неявно делаете то же самое. Никакого тайного смысла сия операция не предполагает. Просто компилятор matlab делает некоторую работу за тех, кто в ней ничего не понимает, а именно, связывает функции, которые используются в m-файле, со своими библиотеками. Вы можете проделать те же операции самостоятельно, если понимаете что к чему. Я-то как раз таки понимаю что к чему, так как читаю документацию: MATLAB C/C++ Graphics Library User's Guide.
Я за вас очень рад, но как-то уж больно вы резки в речях
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
31.08.2013, 23:24 46
Ну резок немного, бывает. Что касаемо упомянутой мною библиотеки Matlab 10-летней давности, то с сожалением должен сказать, что на просторах сети очень трудно найти кого-то, кто ей бы пользовался. Кроме того, при компиляции современными компиляторами нужно немного допиливать проект, чтобы сборка прошла успешно, так как немного всё устарело. Это касается использования функций, где параметрами выступают тоже функции, типа решателей ОДУ.

Меня-то как раз больше всего решатели ОДУ для жёстких систем интересовали. В сети таковых в свободном доступе можно по пальцам одной руки пересчитать. Всё остальное там тоже в принципе интересно, только матричный подход не очень удобен, приходится выковыривать результаты.

Для людей, которых интересуют численные расчёты в неуправляемом пространстве на C++, эта библиотека должна быть на первых местах в инструментарии. Она покрывает большую часть типичных численных расчётов, кроме того синтаксис программы получается максимально приближен к тому, что мы видим в m-файлах.
0
msekr
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 15
02.09.2013, 11:43 47
А можно создать приложение без установки MCR (MATLAB Component Runtime)?
0
lomt
449 / 275 / 13
Регистрация: 13.11.2012
Сообщений: 589
Записей в блоге: 1
02.09.2013, 12:16  [ТС] 48
Цитата Сообщение от msekr Посмотреть сообщение
А можно создать приложение без установки MCR (MATLAB Component Runtime)?
Как раз об это и холиварил уни в последних постах, советую почитать.
0
msekr
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 15
02.09.2013, 12:53 49
Но это же только в Matlab 6.5? А в новых всё так плохо?
0
lomt
449 / 275 / 13
Регистрация: 13.11.2012
Сообщений: 589
Записей в блоге: 1
02.09.2013, 12:56  [ТС] 50
НУ примеры да, но общий подход для поздних версий схож, я думаю. А вообще лучше дождаться ответа Уни, так как он с этим разобрался.
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
02.09.2013, 14:54 51
Я разобрался только с Matlab 6.5, так как не хотел устанавливать MCR из новых версий. Они слишком много занимают. Практически столько же как Matlab 6.5 целиком. Для моего приложения в 100 КБайт просить пользователя устанавливать несколько сот мегабайт как-то не очень хорошо.

Тут вопрос в том, а что именно вам нужно от Matlab'а и в каком окружении? Если это какие-то новые фичи из новых версий, то пользуйтесь уж тем что есть, а если вы хотите как я получить доступ из C++ к нескольким сотням матричных численных функций, то существует способ попроще, без установок, без Matlab'а и дополнительным размером в 8,5 Мбайт всего.

Пробовать то же самое для новых версий я тоже буду, но попозже, когда до меня дойдёт очередная книжка Смоленцева и Ко, где .Net уже используется. По идее там должно быть попроще. Надеюсь, что код в новых версиях выполняется всё равно в неуправляемом пространстве, а .Net библиотеки - лишь обёртки для него. Иначе использование новых версий для тех, кто ждёт быстродействия, бессмысленно. Это ещё одна причина, по которой я использую старую библиотеку.
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
02.09.2013, 15:09 52
А вот и новая книжка Смоленцева. Посмотрим что там можно сделать. Мне интересна та часть, где описано программирование под .Net. По идее на C# программировать должно быть проще, чем на C++, но, если вычисления выполняются в управляемом пространстве, то они будут медленнее в несколько раз, чем те же в неуправляемом.

Что касается MCR, если там нет какой-то хитрой регистрации, должно быть достаточно положить рядом с программой те dll, которые она требует. Для этого нужно установить MCR, скопировать куда-нить его файлы, а потом удалить его из системы. Ну, а далее нужно подсовывать программе dll'ки, пока она не заработает. Это упрощённый подход такой. Тут ещё нужно отделять понятия "программы". Программа может быть как приложение, написанное на C#, и как "обработчик" m-файла. Второй случай сложнее.
0
SoniLatnikova
0 / 0 / 1
Регистрация: 23.07.2013
Сообщений: 36
02.09.2013, 18:11 53
И звени пожалуйста, может очень глупый вопрос.

А для MATLAB R2013a. Делать так как ты показал на инструкции?
0
lomt
449 / 275 / 13
Регистрация: 13.11.2012
Сообщений: 589
Записей в блоге: 1
02.09.2013, 18:28  [ТС] 54
Тут всё очень просто на самом деле, в случаи Уни, он уменьшал объём своей программы подключением отдельных функций Матлаб в свой сишный код, не ставя громоздкий MCR.Для 2013a попробуй сначала сделать, как я описал в начальном сообщение темы, с новыми библиотеками уни такие же операции пока не делал...
0
SoniLatnikova
0 / 0 / 1
Регистрация: 23.07.2013
Сообщений: 36
03.09.2013, 23:26 55
Попробую, спасибо.
0
vovsanuch
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 47
Завершенные тесты: 1
01.10.2013, 20:51 56
Зосима,lomt, вот в программе строчка есть "msgbox({Answer1,Answer2,Answer3},'Ответ');"
можно как-нибудь вместо текста чтобы выводился график через plot()??
чтобы после конвертирование в exe файл,после введения данных и вычисления выводился график?
0
msekr
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 15
06.10.2013, 12:55 57
Хотелось бы ещё раз задать вопрос Уни. Я скомпилировал m-файл в программе Matlab 6.5, получил .exe файл. Он прекрасно работает. На системе, где не установлен Matlab я его запустил, стал добавлять, согласно выведенному сообщению, необходимые .dll файлы. Добавил их штук 15-20. Затем, когда добавил все dll-ки, при вызове полученной независимой программе DOS-окно стало схлопываться, т.е. открываться на доли секунды и закрываться. Но с помощью программы Camtasia я расшифровал надпись на схлопывающемся окне и понял, что программа запрашивает ещё файлы license.dat и demo.lic. Файл license.dat в Matlab я нашёл. А demo.lic не смог найти. На этом всё и закончилось. Не могли бы подсказать, что далее можно было бы сделать здесь?
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
06.10.2013, 13:26 58
Для начала, нужно проверить будет ли работать программа с RTL библиотекой Matlab 6.5. Для этого на целевом компьютере нужно установить Matlab C++ Math and Graphics Run Time Library 2.1. Дистрибутив идёт вместе с Matlab 6.5 в папке C:\MATLAB6p5\extern\lib\win32. Файл: mglinstaller.exe (~8.5 Мб).
Этот файл нужно скопировать на целевой компьютер и запустить там. Библиотеку нужно установить по какому-то пути, например, на диск C:\MATLAB6p5\. Установщик выводит приглашение с комментариями.

После этого, как написано в комментариях, нужно добавить в системную переменную path целевого компьютера папку C:\MATLAB6p5\bin (или C:\MATLAB6p5\bin\win32, я уже не помню). Вот теперь можно запускать вашу программу. Она найдёт RTL библиотеку по пути в переменной path.

Это стандартный вариант, который предлагает MathWorks. Есть второй вариант, когда эту библиотеку можно расположить рядом с программой. Он немного сложнее. Попробуйте сначала стандартный путь, а потом я расскажу, если нужно, как можно обойти лишние телодвижения.
1
msekr
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 15
06.10.2013, 13:45 59
Спасибо, Уни. Но с mglinstaller мне всё понятно. Просто я хотел чисто версию portable из m-файла сделать, т.е. без mglinstaller и mcrinstaller. Но видать это пока нереально. А может какие-нибудь есть портативные версии mglinstaller или mcrinstaller?
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
06.10.2013, 13:49 60
Использование mglinstaller - это и есть портативность, просто нужно немножко подумать и разместить все файлы из пакета рядом в папке с программой. Вот и всё. При запуске программа обнаружит пакет по текущему пути и никаких других действий не нужно.
Сам этот пакет можно вставить архивом в ресурсы и распаковывать при запуске программы. Либо можно поискать программы, которые умеют это делать. Я сам не пользовался, но знаю, что есть программы, которые могут упаковать всё, что нужно, для создания портативной версии.
1
06.10.2013, 13:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2013, 13:49

Открытие файла Matlab 7.14 в Matlab 7.12
доброго всем вечера.такая вот проблемка.создал файл в матлабе,но в версии 7.14...

Открытие файлов .exe в matlab
можно ли открыть файл ехе в матлабе так, чтобы он показал код этой программы на...

Matlab-ский exe-шник не запускается
Всем привет! Просили с учёбой помочь и принесли программу сделанную в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru