2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 использование DLL в Matlab
Сообщение13.04.2017, 11:54 


07/10/15

2400
Добрый день,
подскажите пожалуйста, почему .dll функция, скомпилированная из .m файла не запускается в среде matlab
при обращении к ней выдаётся сообщение следующего содержания:
Цитата:
Undefined function 'Q_fil' for input arguments of type 'double'

то есть Matlab её как бы и не видит, но компиляция прошла нормально, без ошибок (выполнялась с помощью Matlab Compiller, с подключенным внешним компилятором VC2010)

сама исходная функция Q_fil.m в Matlab работает нормально, только слишком медленно (собственно из за этого и компилирую)

в чём здесь может быть ошибка (у меня Matlab 2013a x64)

 Профиль  
                  
 
 Posted automatically
Сообщение13.04.2017, 12:16 
Модератор


19/10/15
1196
 i  Тема перемещена из форума «Computer Science» в форум «Околонаучный софт»

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение13.04.2017, 18:05 
Заслуженный участник


12/07/07
4522
Andrey_Kireew, а функция при помощи loadlibrary загружалась? Если таким способом, то что возвращает libfunctions?

(И лучше сразу весь текст загрузки функции привести.)

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение13.04.2017, 23:09 


07/10/15

2400
Про loadlibrary ничего не слышал, думал запускать нужно так же как и .m функцию, просто из командной строки matlab.

Сейчас попробовал, что то заработало, выполняю команды:
Код:
>> hfile = fullfile('C:','Users','User','Documents','MATLAB','Q_filt.h');
>> loadlibrary('Q_filt',hfile)


выдаёт предупреждение
Код:
Warning: Warnings messages were produced while parsing.  Check the
functions you intend to use for correctness.  Warning text can be viewed
using:
[notfound,warnings]=loadlibrary(...)
> In loadlibrary at 344
Warning: The data type 'FcnPtr' used by function
Q_filtInitializeWithHandlers does not exist.
> In loadlibrary at 403
Warning: The data type 'FcnPtr' used by function
Q_filtInitializeWithHandlers does not exist.
> In loadlibrary at 403


смотрю какие функции загрузились

Код:
>> libfunctions('Q_filt')

Functions in library Q_filt:

Q_filtInitialize              mlfQ_filt                     
Q_filtInitializeWithHandlers  mlxQ_filt                     
Q_filtPrintStackTrace         
Q_filtTerminate               


как запускать не пойму, пробовал так
Код:
>> out =calllib('Q_filt','Q_filtPrintStackTrace',x,3,1001,0.5);
Error using calllib
No method with matching signature.


ничего не получается, вообще всё намного сложнее чем я ожидал ...
подскажите пожалуйста как сделать чтобы всё таки заработало

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 00:23 
Заслуженный участник
Аватара пользователя


01/09/13
4656
В прежних версиях я просто компилировал C код с подключением библиотек MatLab'а из любого стандартного компилятора... работает пока.

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 02:02 


07/10/15

2400
Однако тема здесь об обратном.

Саму библиотеку я могу полностью написать на С++, но работать с ней хотелось бы в среде Matlab, так будет проще и намного быстрее исследовать алгоритм.

Где то в сети прочитал, что matlab запросто работает с dll и обращаться к ним можно как к обычным m - функциям. Теперь оказывается её сначала нужно загружать, а потом ещё как то запустить содержащуюся в ней функцию.

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 10:24 
Заслуженный участник
Аватара пользователя


01/09/13
4656
Andrey_Kireew в сообщении #1209316 писал(а):
Саму библиотеку я могу полностью написать на С++, но работать с ней хотелось бы в среде Matlab, так будет проще и намного быстрее исследовать алгоритм.

Именно, Вы пишите критические блоки на C (C++) и вызываете их как функции из MatLab'а без всяких "подгрузок" (просто dll'ка должна содержать mexFunction, через которую и производится вызов)

-- 14.04.2017, 10:33 --

https://www.mathworks.com/help/matlab/c ... les-1.html

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 10:58 
Заслуженный участник


12/07/07
4522
Andrey_Kireew в сообщении #1209316 писал(а):
Где то в сети прочитал, что matlab запросто работает с dll и обращаться к ним можно как к обычным m - функциям.
В старых версиях loadlibrary не было (но в R2013 уже есть). loadlibrary предназначена для преодоления ограничений стандартного способа вызова внешних функций (mex — Matlab EXternal). В простейших случаях в явной загрузке необходимости нет. Для старых версий описание на русском можно найти в книге Мартынов Н.Н., Иванов А.П. “Matlab 5.X. Вычисления, визуализация, программирование” (легко нагуглить электронную версию в сети).

[Upd]loadlibrary c 7-ой версии.[/Upd]

По теме. Andrey_Kireew, приведите детали. Иначе трудно угадать.

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 11:53 


07/10/15

2400
Geen в сообщении #1209353 писал(а):
Именно, Вы пишите критические блоки на C (C++) и вызываете их как функции из MatLab'а без всяких "подгрузок" (просто dll'ка должна содержать mexFunction, через которую и производится вызов)
Да нет, Вы не поняли, я не писал блоки на С++, эта функция написана в matlab в виде m - файла. Там была всего одна функция Q_filt.m, откуда в библиотеке появилось несколько - пока понять не могу. Компиляция вся проводилась в среде матлаб, с помощью Matlab Comoiller. EXE файлы он создаёт запросто, но для .dll требует внешний компилятор. Я указал VC2010, т.к. у меня есть только он. Вообще есть все основания полагать, что при таком подходе всё необходимое для запуска в matlab должно создаваться само. Попробую ещё разок откомпилировать поменяв настройки.

За ссылку спасибо - почитаю. Но судя по всему там именно о том что вы говорите, т.е. о внешних файлах, написанных на С++. В перспективе конечно я думаю так и сделать, так как это позволит максимально оптимизировать код. Но пока мне хотелось бы скомпилировать m - функцию непосредственно, чтобы понять какой выигрыш даёт компиляция и на что можно рассчитывать.

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 12:18 
Заслуженный участник
Аватара пользователя


01/09/13
4656
Andrey_Kireew в сообщении #1209368 писал(а):
Но пока мне хотелось бы скомпилировать m - функцию непосредственно

Перепишите (напишите) на C именно эту функцию - Вы наверняка сумеете написать её более оптимально чем "конвёртер" из m в C.

Andrey_Kireew в сообщении #1209368 писал(а):
понять какой выигрыш даёт компиляция и на что можно рассчитывать.

Выигрыш может быть несколько порядков (зависит и от самой функции и от её использования).

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 12:45 


07/10/15

2400
Это будет не так быстро, а посмотреть хочется уже сейчас

я вот перекомпилировал с другим именем, и она вроде как стала работать
Код:
>> out =calllib('QF','mlxQ_filt',x,3,1001,0.5);
Error using calllib
Parameter must be scalar.


если вместо x ввожу число - она возвращает 0 и никаких ошибок, но x - это вектор и возвращать она должна вектор

при компиляции выдаётся предупреждение
Код:
>> warnings
warnings =
QF.h  Type 'intvoidPtr__ptr64' was not found.  Defaulting to type error.  Found on line 11585 of input from line 290 of file C:\\Program Files (x86)\\Microsoft


может в этом дело?

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение14.04.2017, 22:20 
Заслуженный участник


12/07/07
4522
1. В старых версиях Matlab можно было создать dll из командного окна.
Традиционный простейший пример. Matlab 6.5. Допустим в текущей директории имеется m-функция
Используется синтаксис Matlab M
function Res = MyAdd(X, Y)
 Res = X + Y;
Если «выбран» компилятор, то после ввода в командном окне
>> mcc -x MyAdd
в текущей директории будут созданы файлы: myadd.c, myadd.h, myadd_mex.c, MyAdd.dll
Теперь «для чистоты эксперимента» спрячем MyAdd.m (удалим или перенесём туда, где Matlab её не найдёт). Затем убедимся, что всё работает
Используется синтаксис Matlab M
>> X = [1, 2]; Y = [1, 2]; MyAdd(X, Y)
ans =
     2     4
(В прятанье нет необходимости: если при вызове функции в одной директории будет найден и m-файл, и dll, то выполнится функция из dll, в соответствии с написанным в Мартынове и Иванове.)

2. В новых версиях (в том числе R2013 64бит) в описанной вами задаче вместо dll используются бинарные mex-файлы. Компилировать из командного окна см. mex. Тогда вызов функции будет, как и в старых версиях (c mex-dll), просто по имени функции.

-- Пт 14.04.2017 21:59:10 --

Грубо говоря, бинарные mex — [64-битный] аналог mex-dll старых версий.

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение15.04.2017, 01:04 
Заслуженный участник


12/07/07
4522
На вопрос начального сообщения
Andrey_Kireew в сообщении #1209150 писал(а):
то есть Matlab её как бы и не видит
Под 32-битной Windows расширение исполняемого mex файла - mexw32. Под 64-битной Windows - mexw64. Желательно проверить для конкретной версии, но скорее всего так и есть.

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение15.04.2017, 10:36 
Заслуженный участник


12/07/07
4522
Andrey_Kireew в сообщении #1209368 писал(а):
Компиляция вся проводилась в среде матлаб, с помощью Matlab Comoiller. EXE файлы он создаёт запросто, но для .dll требует внешний компилятор. Я указал VC2010, т.к. у меня есть только он.
Это не понятно. Вроде lcc идёт только с 32-битной версией (и это все равно внешний компилятор). С 64-битной он не идёт (и согласно сведениям на сайте MathWorks, и сам только что на одном из компьютеров проверил для R2013b 64bit). Скорее всего mcc просто использовал единственный доступный из совместимых компиляторов (или просто единственный доступный).
upd По поводу использования mcc компилятора. Тут возможно я не прав. И так было в старых версиях.upd

-- Сб 15.04.2017 10:08:06 --

Andrey_Kireew в [url=http://dxdy.ru/post1209378.html#p1209378] писал(а):
может в этом дело?
Понятно, что работать не будет. :) На компе с R2013 (где я могу попробовать) деинсталлирован VC, поэтому содержательного ничего не скажу. Я бы попробовал исполняемый mex сделать из среды matlab и если ошибка повториться, то написать в тему - может найдутся участники с установленным VC.

(К слову, ни VC 2010 Redistributable, ни VC 2013 Redistributable в список поддерживаемых matlab компиляторов не входит и использовать его у меня не получилось.)

 Профиль  
                  
 
 Re: использование DLL в Matlab
Сообщение15.04.2017, 15:29 


07/10/15

2400
Да, я тоже хочу его сделать, но не получается.
Пришлите мне, пожалуйста, ссылку на какой-нибудь рабочий пример.
Из help matlab я ничего так и не понял (в смысле как компилировать в mex)

Вот здесь очень обнадеживающе написано как его сделать из m-файла
http://www.studfiles.ru/preview/5543674/page:4/
Но у меня ничего не вышло.
Команда
Код:
>> mex -setup
проходит нормально.
Кстати, тут написано, что VC 2010 Professional поддерживается (у меня RТMRel - тоже наверно должен работать)
SystemRequirements-Release2013a_SupportedCompilers.pdf

Команда
Код:
>> mcc  Q_filt
уже не работает, пишет, что не определён тип целевого приложения.

Опытным путём дошел вот до чего
Код:
>> mcc -win64 -W cpplib:QF -T link:lib -d C:\Users\User\Documents\MATLAB\QF\src  C:\Users\User\Documents\MATLAB\Cardi\стат_тесты\Q_filt.m
И она работает: в папке C:\Users\User\Documents\MATLAB\QF\src появляются dll и всё остальное.

Может нужно просто что-то изменить в этой строке, чтобы появлялся mex - файл?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: DariaRychenkova


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group