Как создать библиотеку в C++ и использовать её функции в Matlab?
Как создать библиотеку в C++ и использовать её функции в Matlab?
Идея в том, чтобы написать функцию на C++ с использованием OpenCL, а использовать этот код в Matlab.
(Меня не интересуют готовые OpenCL и Cuda решения для Matlab)
Отслеживать
задан 11 мар 2012 в 11:52
413 1 1 золотой знак 4 4 серебряных знака 19 19 бронзовых знаков
Обнаружил интересную информацию по MEX файлам и Matlab AddIn for Visual Studio. Но всё равно было бы интересно поглядеть мануальчик какой-нибудь
11 мар 2012 в 12:21
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для этого потребуется создать исполняемый MEX-файл. Подробнее здесь:
- How can I interface MATLAB code with C, C++, or FORTRAN?
- C++ with Matlab Tutorial
Отслеживать
ответ дан 11 мар 2012 в 17:23
34.5k 25 25 золотых знаков 97 97 серебряных знаков 214 214 бронзовых знаков
- matlab
- c++
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Добавить матлабовские библиотеки к проекту на С++
Хочу создать mex-файл и мне надо добавить некоторые библиотеки к проекту, но несмотря на то, что я даже скопировал их в директорию проекта, когда я открываю, добавить ссылку в Visual Studio, там пусто. Что делать?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Подключение библиотеки к Qt проекту
В *.pro файле подключаю библиотеку таким образом: INCLUDEPATH += . с:/source/library/include.
Подключение С библиотеки (.so) к проекту С++
С++ не хочет подключать сишную библиотеку, пробовала подключить и методами gcc из консоли, и.
Подключение С/С++ библиотеки к проекту на C#
Помогите новичку подключить С/С++ библиотеку к проекту на C# Проблема: — есть DLL написанная на.
Подключить библиотеки к проекту
Не могу запустить проект , который работает с DirectX . Не видит библиотек и заголовков . Как.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Подключить все библиотеки к проекту
Здравствуйте! у меня в проекте используется EMGUCV. Как образом мне все библиотеки включить в EXE.
Подключение библиотеки ffmpeg к проекту
Здравствуйте. Я начал разбираться с библиотекой ffmpeg. Но не пойму как ее можно подключить к.
Подключение динамической библиотеки C# к проекту Qt C++
Здравствуйте Пробую подключить библиотеку созданную VC код С# using System; using.
Подключение vb.net библиотеки к проекту на C#
Всем здравия. Начинаю изучать C# и одновременно переносить свой проект с одного языка на другой.
Использование .Net библиотек в MATLAB
Привет Хабровчанам! На Хабре уже обсуждался вопрос интеграции .Net c Matlab’ом. Цель же этой статьи — показать, как можно быстро и удобно решить обратную задачу: вызывать управляемый код из произвольных .Net библиотек в Matlab.
Зачем это нужно?
Несмотря на богатый набор алгоритмов в функционале Matlab’а, основным сценарием, в котором это может понадобиться, является необходимость задействовать в вычислениях уже имеющиеся и обладающие известными показателями качества .Net библиотеки, в которых реализованы математические алгоритмы.
Disclaimer
Пример, который рассматривается в статье, описывает типичный набор случаев возникающих при интеграции, достаточный для проведения широкого класса вычислений, однако, не охватывает всех возможностей интеграции с .Net, которые присутствуют в Matlab.
Код из данной статьи был сделан и протестирован на Windows платформе и в конкретной версии Matlab 2013a. В качестве версии .Net Framework использовалась 4.5, IDE — VS 2012.
Создание объектов .Net в Matlab
В качестве простого примера рассмотрим создание объекта стандартного класса DateTime из .Net.
Получение текущей даты-времени из .Net может быть записано следующим Matlab кодом
dateTimeNow = System.DateTime.Now
Сразу же обратим внимание, что это полный код. От нас не требуется явного подключения каких-либо системных библиотек .Net, и CLR переменная dateTimeNow автоматически становится переменной Matlab’a. Если же данный вызов завершился с ошибкой, можно проверить булевский результат команды, которая проверяет поддержку .Net в среде.
isnetsupported = NET.isNETSupported
В качестве примера вызова метода CLR объекта, прибавим к текущей дате 10 минут, используя привычный дотнетчикам метод AddMinutes
dateTimeNow = dateTimeNow.AddMinutes(10)
В результате запуска данных команд в выводе отображается содержимое полученных объектов
Date: [1x1 System.DateTime] Day: 21 DayOfWeek: [1x1 System.DayOfWeek] DayOfYear: 111 Hour: 13 Kind: [1x1 System.DateTimeKind] Millisecond: 160 Minute: 49 Month: 4 Now: [1x1 System.DateTime] UtcNow: [1x1 System.DateTime] Second: 56 Ticks: 635021489961600559 TimeOfDay: [1x1 System.TimeSpan] Today: [1x1 System.DateTime] Year: 2013 MinValue: [1x1 System.DateTime] MaxValue: [1x1 System.DateTime]
Готовим DLL
Прежде чем научиться загружать произвольную сборку в Matlab, займемся ее подготовкой.
В качестве простого примера реализуем в целевой .Net библиотеке c именем Algorithms.dll алгоритм поиска левого верхнего угла ограничивающего прямоугольника бинарного изображения.
Это можно сделать с помощью такого кода на C#:
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Algorithms < public class ImageProcessor < public ImageProcessor() <>/// /// Возвращает в массиве coordinates координаты левого верхнего угла бинарной картинки /// на изображении. Если их нет - /// /// Входное бинарное изображение /// Координаты левого верхнего угла public void GetLeftUpperCornerBB(Bitmap bitmap, out int[] coordinates) < coordinates = null; var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); unsafe < //получаем указатель на память изображения uint* p = (uint*) bitmapData.Scan0.ToPointer(); coordinates = new int[2]; //пиксели записаны по строкам for (int i = 0; i < bitmap.Height*bitmap.Width; i++) < if( (*p & 0xFFFFFF) == 0) //нашли первый черный пиксель < coordinates[0] = i / bitmap.Width; break; >p++; > p = (uint*) bitmapData.Scan0.ToPointer(); for (int i = 0; i < bitmap.Height*bitmap.Width; i++) < if( (p[( i % bitmap.Height) * bitmap.Width + ( i / bitmap.Height) ] & 0xFFFFFF) == 0) //нашли первый черный пиксель < coordinates[1] = i / bitmap.Height; break; >> > bitmap.UnlockBits(bitmapData); > > >
Данный код является специфическим: мы будем рассматривать вызов нестатических public методов из Matlab, которые возвращаются значения с помощью ключевого слова out . Метод GetLeftUpperCornerBB принимает на вход объект класса Bitmap , в котором содержится бинарное изображение, и возвращает в массиве coordinates координаты первого левого верхнего черного пикселя (а если такого на изображении нет, например, в случае пустого изображения, то возвращается null ).
Загрузка custom’ных .Net библиотек в Matlab

В директории Matlab проекта создадим новый Matlab-файл Example.m , рядом с которым поместим полученную на предыдущем шаге библиотеку Algorithms.dll (см. скриншот ниже)
С помощью вызова функции addAssembly загрузим сборку в Matlab.
netAssembly = NET.addAssembly('D:\Work\MatlabNetIntegrationExample\Algorithms.dll')
просмотрим список классов загруженной сборки
netAssembly.Classes
ans = 'Algorithms.ImageProcessor'
с помощью команды
import Algorithms.*
включаем namespace Algorithms.
Создаем объект класса ImageProcessor и загружаем входное изображение в переменную bitmap
imageProcessor = ImageProcessor(); bitmap = System.Drawing.Bitmap('picture.bmp')
файл picture.bmp при этом располагается в текущей рабочей директории.
Команда
methods (imageProcessor)
покажет нам список доступных методов данного объекта
Methods for class Algorithms.ImageProcessor: Equals delete le GetHashCode eq lt GetLeftUpperCornerBB findobj ne GetType findprop notify ImageProcessor ge ToString gt addlistener isvalid
Теперь, запускаем целевой метод GetLeftUpperCornerBB и получаем результат
coords = imageProcessor.GetLeftUpperCornerBB(bitmap);
Если бы у нас было несколько out параметров (предположим, целых три массива с координатами), то мы бы написали такой код для их получения
[coords, cords2, cords3] = imageProcessor.GetLeftUpperCornerBB(bitmap);
Отметим, что результат является CLR объектом типа System.Int32[] , поэтому для возможного удобства работы с ним существует возможность конвертировать данный массив в native массив Matlab’a. Например:
arrayOfDoubles = coords.double; arrayOfIntegers = coords.int32;
Обратная конвертация возможна с помощью функции NET.convertArray .
Итого, получаем следующий листинг:
netAssembly = NET.addAssembly('D:\Work\MatlabNetIntegrationExample\Algorithms.dll'); netAssembly.Classes; import Algorithms.*; imageProcessor = ImageProcessor(); bitmap = System.Drawing.Bitmap('picture.bmp'); methods (imageProcessor); coords = imageProcessor.GetLeftUpperCornerBB(bitmap); arrayOfIntegers = coords.int32;
Заключение
Мы решили задачу создания .Net объекта в Matlab, запуска методов .Net классов и получения результатов.
Отдельно стоит заметить, что согласно документации Matlab выгрузка загруженных .Net модулей не предусмотрена явно. Поэтому, для замены DLL файла потребуется как минимум перезагрузка IDE Matlab. В остальном, в версии 2013a представлена достаточно полная поддержки интеграции .Net в смысле возможностей работы с различными элементами CLR и их атрибутами.
Используемые материалы
Документация
В этом примере показано, как создать библиотеку блоков и добавить его в Simulink ® Library Browser. Этот пример также показывает, как добавить подбиблиотеку.
Чтобы указать информацию о вашей библиотеке, вы создаете функцию с именем slblocks .
Добавьте библиотеку в браузер библиотеки
- От начальной страницы Simulink выберите Blank Library и нажмите Create Library.
Примечание Браузер Библиотеки только поддерживает библиотеки. Вы не можете отобразить содержимое модели в Браузере Библиотеки.
set_param(gcs,'EnableLBRepository','on');
function blkStruct = slblocks % This function specifies that the library 'mylib' % should appear in the Library Browser with the % name 'My Library' Browser.Library = 'mylib'; % 'mylib' is the name of the library Browser.Name = 'My Library'; % 'My Library' is the library name that appears % in the Library Browser blkStruct.Browser = Browser;
Примечание Можно сохранить функцию как .m или .mlx файл. Вы не можете сохранить его как Pcode-файл.

Примечание
Если вы сохраненный ваша библиотека без установки ‘EnableLBRepository’ к ‘on’ , сообщение появляется наверху Браузера Библиотеки.

Нажмите Fix и ответьте на подсказку как соответствующую.
Добавьте подбиблиотеку в браузер библиотеки
Выполните эти шаги, чтобы добавить подбиблиотеку под названием mylib2 к вашему mylib библиотека.
- Создайте библиотеку под названием mylib2 . Добавьте некоторые блоки в него.
- В командном окне MATLAB, набор EnableLBRepository свойство библиотеки к ‘on’ для новой библиотеки.
set_param(gcs,'EnableLBRepository','on');


Задайте порядок библиотеки в списке библиотек
Можно задать порядок библиотеки относительно других библиотек в списке путем добавления sl_customization.m файл к пути MATLAB и установке приоритета вида вашей библиотеки. Например, чтобы видеть вашу библиотеку наверху списка, можно установить приоритет вида на -2 . По умолчанию приоритетом вида Библиотеки Simulink является -1 . Другие библиотеки имеют приоритет вида 0 по умолчанию, и эти библиотеки появляются ниже Библиотеки Simulink. Библиотеки с тем же приоритетом вида появляются в алфавитном порядке.
Это демонстрационное содержимое sl_customization.m файл размещает новую библиотеку наверху списка библиотек.
function sl_customization(cm) % Change the order of libraries in the Simulink Library Browser. cm.LibraryBrowserCustomizer.applyOrder('My Library',-2>); end
Заставить индивидуальную настройку сразу вступить в силу, в командном окне MATLAB, введите:
sl_refresh_customizations

Похожие темы
- Создайте пользовательскую библиотеку
- Настройте внешний вид браузера библиотеки
- Укажите индивидуальные настройки с Simulink
Документация Simulink
- Примеры
- Блоки и другая ссылка
- Информация о релизах
- PDF-документация
Поддержка
- MATLAB Answers
- Помощь в установке
- Отчеты об ошибках
- Требования к продукту
- Загрузка программного обеспечения
© 1994-2021 The MathWorks, Inc.
- Условия использования
- Патенты
- Торговые марки
- Список благодарностей
Для просмотра документации необходимо авторизоваться на сайте
Войти
Памятка переводчика
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.
