exponenta event banner

Распространение приложения Visual Basic

Вызов скомпилированных функций MATLAB из Microsoft Excel

Для вызова скомпилированных функций MATLAB ® из электронной таблицы Microsoft ® Excel ® выполните указанные ниже действия на компьютерах разработки и развертывания.

Примечание

Для вызова функции с использованием синтаксиса функции Microsoft Excel (=myfunction(input)), функция MATLAB должна возвращать один скалярный выходной аргумент.

Выполните следующие действия на компьютере разработки:

  1. Создайте следующие функции MATLAB в трех отдельных файлах с именем doubleit.m, incrementit.m, и powerit.m, соответственно:

     function output = doubleit(input)
       output = input * 2;
    function output = incrementit(input1, input2)
       output = input1 + input2;
     function output = powerit(input1, input2)
       output = power(input1, input2);
    
  2. Запустите компилятор библиотеки.

  3. При работе с этим примером с помощью инструкций в разделе Создание надстройки Excel из MATLAB используйте следующую информацию:

    Имя приложенияmyexcelfunctions
    Имя классаmyexcelfunctionsclass
    Экспортированные функции

    doubleit.m incrementit.m powerit.m

Выполните следующие действия на компьютере развертывания:

  1. Копировать содержимое for_redistribution_files_only на машины развертывания. Копирование файла в стандартное место для использования с Microsoft Excel, например Office_Installation_folder\Library\MATLAB где Office_Installation_folder является папкой, например C:\Program Files\Microsoft Office\OFFICE11.

  2. Установка и настройка среды выполнения MATLAB.

  3. Зарегистрироваться myexcelfunctions_1_0.dll.

    Внимание

    Вам нужно перерегистрировать файл DLL, если вы перемещаете его после его создания. В отличие от файлов DLL, файлы Excel можно перемещать в любое время.

  4. Запустите Microsoft Excel. Электронная таблица Book1 должен быть открыт по умолчанию.

  5. В Excel выберите Инструменты > Редактор Visual Basic. Запускается редактор Microsoft Visual Basic ®.

  6. В редакторе Microsoft Visual Basic выберите «Файл» > «Импортировать файл».

  7. Перейти к myexcelfunctions.bas и нажмите «Открыть». В обозревателе проектов Module1 отображается в узле «Модули» под VBAProject (Book1).

  8. В редакторе Microsoft Visual Basic выберите Просмотр > Microsoft Excel. Теперь вы можете использовать doubleit, incrementit, и powerit функции в электронной таблице Book1.

  9. Протестируйте функции, выполнив следующие действия:

    1. Войти =doubleit(2.5) в клеточных A1.

    2. Войти =incrementit(11,17) в клеточных A2.

    3. Войти =powerit(7,2) в клеточных A3.

    Значения 5, 28 и 49 должны отображаться в ячейках A1, A2 и A3 соответственно.

  10. Для использования doubleit, powerit, и incrementit во всех новых электронных таблицах Microsoft Excel выполните следующие действия.

    1. Выберите «Файл» > «Сохранить как».

    2. Измените параметр Сохранить как тип на .xlt (Шаблон).

    3. Перейдите к Office_Installation_folder\XLSTART папка.

    4. Сохранить файл как Office_Installation_folder\XLSTART\Book.xlt.

    Примечание

    Для сохранения этого шаблона необходимо установить средний или низкий уровень безопасности макросов Microsoft Excel.

Где код примера?

Дополнительные сведения о доступе к коду примера из продукта см. в разделе Копирование файла примера.

Улучшение доступа к данным с помощью интерфейса пользовательских данных среды выполнения MATLAB и COM-компонентов

Обзор

Эта функция обеспечивает легкий интерфейс для простого доступа к данным среды выполнения MATLAB. Это позволяет совместно использовать данные экземпляра среды выполнения MATLAB, кода MATLAB, выполняющегося в этой среде выполнения MATLAB, и кода оболочки, создавшего среду выполнения MATLAB. С помощью вызовов API интерфейса пользовательских данных среды выполнения MATLAB осуществляется доступ к данным среды выполнения MATLAB путем создания ассоциативного массива экземпляра среды выполнения для каждого MATLAB. mxArrays, состоящий из отображения из строковых ключей в mxArray значения. Причины для этого включают, но не ограничиваются:

  • Необходимо предоставить информацию о профиле времени выполнения клиенту, выполняющему приложение, созданное с помощью Toolbox™ параллельных вычислений. Информация профиля может предоставляться (и изменяться) на основе выполнения. Например, два экземпляра одного и того же приложения могут выполняться одновременно с разными профилями.

  • Необходимо инициализировать среду выполнения MATLAB с постоянными значениями, которые доступны для всех приложений MATLAB.

  • Необходимо настроить глобальную рабочую область - глобальную переменную или переменные, к которым MATLAB и клиент могут получить доступ.

  • Необходимо сохранить состояние любой переменной или группы переменных.

MATLAB Compiler™ поддерживает доступ к состоянию экземпляра MATLAB Runtime через объектно-ориентированный API. В отличие от компилятора MATLAB, доступ по состоянию экземпляра среды выполнения MATLAB является необязательным, а не включенным по умолчанию. Вы можете получить доступ к этому состоянию, добавив setmcruserdata.m и getmcruserdata.m в проект развертывания или путем их указания в командной строке. Кроме того, для вызова этих методов используется вспомогательная функция, как показано в разделе Предоставление информации о профиле времени выполнения для приложений панели инструментов параллельных вычислений.

Дополнительные сведения см. в Руководстве пользователя компилятора MATLAB.

Предоставление информации о профиле времени выполнения для приложений панели инструментов параллельных вычислений

Ниже приведен полный пример использования интерфейса пользовательских данных среды выполнения MATLAB в качестве механизма определения профиля для приложений Parallel Computing Toolbox.

Примечание

Автономные исполняемые файлы и общие библиотеки, созданные из MATLAB Compiler или MATLAB Compiler SDK™ для параллельных приложений, теперь могут запускать до двенадцати локальных сотрудников без MATLAB Parallel Server™.

Шаг 1: Напишите код набора инструментов для параллельных вычислений

  1. Собрать sample_pct.m в MATLAB.

    В этом примере используется кластер, определенный в профиле по умолчанию.

    В выходных данных предполагается, что профилем по умолчанию является local.

    function speedup = sample_pct (n)
    warning off all;
    tic
    if(ischar(n))
        n=str2double(n);
    end
    for ii = 1:n
       (cov(sin(magic(n)+rand(n,n))));
    end
    time1 =toc;
    parpool;
    tic
    parfor ii = 1:n
       (cov(sin(magic(n)+rand(n,n))));
    end
    time2 =toc;
    disp(['Normal loop times: ' num2str(time1) ...
        ',parallel loop time: ' num2str(time2) ]);
    disp(['parallel speedup:  ' num2str(1/(time2/time1)) ...
        ' times faster than normal']);
    delete(gcp);
    disp('done');
    speedup = (time1/time2);
    
  2. Запустите код следующим образом после изменения профиля по умолчанию на local, при необходимости.

    a = sample_pct(200)

  3. Убедитесь, что получены следующие результаты:

    Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.
    Normal loop times: 0.7587,parallel loop time: 2.9988
    parallel speedup:  0.253 times faster than normal
    Parallel pool using the 'local' profile is shutting down.
    done
    
    a =
    
        0.2530

Шаг 2: Настройка профиля панели инструментов параллельных вычислений.  Для компиляции кода MATLAB в COM-компонент и использования панели инструментов параллельных вычислений, mcruserdata должен быть установлен непосредственно из MATLAB. Нет API для доступа к MCRUserdata как и для приложений C и C++, построенных с помощью компилятора MATLAB.

Для установки mcruserdata из MATLAB создайте init функция в классе COM. Это отдельная функция MATLAB, которая использует setmcruserdata для однократной установки профиля панели инструментов параллельных вычислений. Затем вы вызываете другие свои функции, чтобы использовать функции Parallel Computing Toolbox.

Создать следующее init функция:

function init_sample_pct
% Set the Parallel Profile:
if(isdeployed)
    [profile] = uigetfile('*.settings'); 
                          % let the USER select file
    setmcruserdata('ParallelProfile',[profile]);
end

Шаг 3. Скомпилировать функцию с помощью инструмента развертывания или командной строки.  Можно скомпилировать функцию из командной строки, введя следующее:

mcc -B 'cexcel:exPctComp,exPctClass,1.0' init_sample_pct.m sample_pct.m

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

  1. Для компиляции приложения выполните действия, описанные в разделе Создание надстройки Excel из MATLAB.

    По завершении компиляции создается новая папка (с тем же именем, что и у проекта).

    Название проектаexPctComp
    Имя классаexPctClass
    Файл для компиляции sample_pct.m и init_sample_pct.m

    Примечание

    При использовании функции графического процессора панели инструментов Parallel Computing Toolbox необходимо вручную добавить файлы PTX и CU.

    При использовании приложения компилятора библиотеки щелкните Добавить файлы/каталоги на вкладке Сборка.

    При использовании mcc используйте команду -a вариант.

  2. Чтобы развернуть скомпилированное приложение, скопируйте for_redistribution_files_only , которая содержит следующее, для конечных пользователей.

    • exPctComp.dll

    • Модуль VBA (.bas файл)

    • Программа установки среды выполнения MATLAB

    • Профиль кластера

    Примечание

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

Шаг 4: Изменение созданного приложения драйвера VBA (файла BAS).  После регистрации COM DLL на компьютере развертывания и импорта файла BAS в Excel измените созданный код файла BAS.

Dim MCLUtil As Object
Dim bModuleInitialized As Boolean
Dim exPctClass As Object
 
Private Sub InitModule()
  If Not bModuleInitialized Then
    On Error GoTo Handle_Error
    If MCLUtil Is Nothing Then
      Set MCLUtil = CreateObject("MWComUtil.MWUtil7.10")
    End If
    Call MCLUtil.MWInitApplication(Application)
    bModuleInitialized = True
    Exit Sub
Handle_Error:
    bModuleInitialized = False
  End If
End Sub
 
Function init_sample_pct() As Variant
 
  On Error GoTo Handle_Error
  Call InitModule
  If exPctClass Is Nothing Then
    Set exPctClass = CreateObject("exPctComp.exPctClass.1_0")
  End If
  Call exPctClass.init_sample_pct
  init_sample_pct = Empty
 
  Exit Function
Handle_Error:
  init_sample_pct = "Error in " & 
                         Err.Source & ": " & Err.Description
End Function
 
 
Function sample_pct(Optional pelle As Variant) As Variant
  Dim speedup As Variant
 
  On Error GoTo Handle_Error
  Call InitModule
  If exPctClass Is Nothing Then
    Set exPctClass = CreateObject("exPctComp.exPctClass.1_0")
  End If
  Call exPctClass.sample_pct(1, speedup, pelle)
  sample_pct = speedup
 
  Exit Function
Handle_Error:
  sample_pct = "Error in " & Err.Source 
                         & ": " & Err.Description
End Function

Выходные данные следующие:

Внедрение кэша и развертываемого архива компонентов среды выполнения MATLAB

развертываемые архивные данные автоматически встраиваются непосредственно в компоненты MATLAB Compiler по умолчанию и извлекаются во временную папку.

Автоматическое встраивание позволяет использовать функции кэша компонентов среды выполнения MATLAB с помощью переменных среды.

Эти переменные позволяют указать следующее:

  • Укажите расположение по умолчанию, в котором необходимо автоматически извлекать развертываемый архив

  • Добавление параметров печати диагностических ошибок, которые можно использовать при автоматическом извлечении развертываемого файла в целях устранения неполадок

  • Настройка размера кэша компонента среды выполнения MATLAB по причинам производительности.

Для изменения этих параметров используйте следующие переменные среды.

Переменная средыЦельПримечания
MCR_CACHE_ROOTЕсли задано расположение, в котором требуется извлечь развертываемый архив, эта переменная переопределяет расположение кэша по умолчанию для каждого пользовательского компонента. Это верно для встраиваемых систем .ctf только файлы.В macOS эта переменная игнорируется в MATLAB R2020a и более поздних версиях. Пакет приложений содержит файлы, необходимые для выполнения.
MCR_CACHE_SIZEПри установке эта переменная переопределяет размер кэша компонента по умолчанию.Начальный предел для этой переменной - 32M (мегабайт). Однако это значение может быть изменено после первого задания переменной. Редактирование файла .max_size, который находится в файле, обозначенном запуском mcrcachedir , с требуемым пределом размера кэша.

Это поведение автоматического встраивания и извлечения можно переопределить, скомпилировав с помощью -C вариант. Дополнительные сведения см. в разделе Переопределение поведения по умолчанию.

Примечание

Если вы бежите mcc определяя конфликтующие типы оболочек и целевых объектов, развертываемый архив не будет встроен в созданный компонент. Например, при выполнении:

mcc -W lib:myLib -T link:exe test.m test.c
произведенный test.exe в него не будет встроен развертываемый архив, как если бы вы указали -C в командной строке.

Внимание

Не извлекайте файлы в пределах.ctf и поместить их по отдельности под управление версиями. С момента .ctf файл содержит взаимозависимые функции MATLAB и данные, доступ к файлам в нем должен осуществляться только путем доступа к .ctf файл. Для достижения наилучших результатов разместите все .ctf под управлением версии.

Переопределение поведения по умолчанию

Чтобы извлечь развертываемый архив способом до R2008b вместе с компилируемым COM-компонентом, выполните компиляцию с помощью mcc -c вариант.

Вы также можете реализовать это переопределение, добавив -c в разделе Настройки приложения компилятора.

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

Для получения дополнительной информации

Дополнительные сведения о развертываемом архиве см. в разделе Развертываемый архив.

Параметры среды выполнения MATLAB

Какие параметры среды выполнения MATLAB поддерживаются компилятором MATLAB?

  • -logfile - Создает именованный файл журнала.

Как задать параметры среды выполнения MATLAB?

Если вы скомпилировали надстройку в MATLAB или использовали mcc.  При создании надстройки с помощью компилятора библиотеки MATLAB выберите Создать файл журнала в разделе Дополнительные параметры среды выполнения.

При создании надстройки с помощью mcc, просто укажите -logfile с mcc -R команда

Если функция создана с нуля с помощью мастера функций.  Если функция была создана с нуля с помощью мастера функций и требуется указать параметры среды выполнения MATLAB, необходимо вручную изменить .bas код файла.

Для этого выполните следующие действия. MWUtil Вызовы API, подробно описанные в примерах класса MWUtil: