Распространение приложения 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. Запустите Library Compiler.

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

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

    doubleit.m incrementit.m powerit.m

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

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

  2. Установка и настройка MATLAB Runtime.

  3. Регистрация myexcelfunctions_1_0.dll.

    Внимание

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

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

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

  6. В редакторе Microsoft Visual Basic выберите File > Import File.

  7. Поиск myexcelfunctions.bas и нажмите Open. В Project Explorer Module1 появляется под узлом Modules под VBAProject (Book1).

  8. В редакторе Microsoft Visual Basic выберите View > 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. Выберите File > Save As.

    2. Измените опцию Save as type на .xlt (Template).

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

    4. Сохраните файл следующим Office_Installation_folder\ XLSTART\Book.xlt.

    Примечание

    Чтобы сохранить этот шаблон, необходимо установить уровень безопасности макросов Microsoft Excel на Medium или Low.

Где находится код примера?

Для получения дополнительной информации о доступе к коду примера из продукта, смотрите Пример копирования файла.

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

Обзор

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

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

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

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

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

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

Для получения дополнительной информации см. Руководство пользователя MATLAB Compiler.

Предоставьте информацию о профиле во время выполнения для приложений Parallel Computing Toolbox

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

Примечание

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

Шаг 1: Напишите код Parallel Computing Toolbox

  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: Установите профиль Parallel Computing Toolbox.  В порядок скомпилировать код MATLAB в COM- компонента и использовать Parallel Computing Toolbox, mcruserdata должен быть установлен непосредственно из MATLAB. Для доступа к MCRUserdata нет доступного API как и для приложений на C и C++, созданных с помощью MATLAB Compiler.

Чтобы задать mcruserdata из MATLAB создайте init функция в классе COM. Это отдельная функция MATLAB, которая использует setmcruserdata чтобы установить профиль Parallel Computing Toolbox один раз. Затем вы вызываете свои другие функции, чтобы использовать функции 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: Скомпилируйте функцию с помощью Deploytool или командной строки.  Можно скомпилировать функцию из командной строки, введя следующее:

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

Также можно использовать deploytool следующим образом:

  1. Чтобы скомпилировать приложение, выполните следующие действия в разделе Создание надстройки Excel из MATLAB.

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

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

    Примечание

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

    Если вы используете приложение Library Compiler, нажмите Add files/directories на вкладке Build.

    Если вы используете mcc команда, используйте -a опция.

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

    • exPctComp.dll

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

    • MATLAB Runtime

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

    Примечание

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

Шаг 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 Runtime и развертываемое архивное встраивание

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

Автоматическое встраивание позволяет использовать функции Кэш через переменные окружения.

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

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

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

  • Настройка размера кэша компонента MATLAB Runtime по причинам эффективности.

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

Переменная окруженияЦельПримечания
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 флаг в Settings разделе приложения компилятора.

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

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

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

MATLAB Runtime

Какие опции MATLAB Runtime поддерживаются MATLAB Compiler?

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

Как задать опции MATLAB Runtime?

Если Вы скомпилировали надстройку в MATLAB или использовали mcc.  Если вы создаете надстройку с помощью MATLAB Library Compiler, выберите Create log file в разделе Additional Runtime Settings.

Если вы создаете надстройку с помощью mcc, просто задайте -logfile с mcc -R команда

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

Вы делаете это, вызывая следующее MWUtil Вызовы API, подробно описанные с примерами в Class MWUtil: