Чтобы улучшить скорость выполнения кода, генерируемого для определенных функций линейной алгебры в блоке MATLAB Function, укажите, что генератор кода производит вызовы LAPACK. LAPACK - библиотека программного обеспечения для числовой линейной алгебры. Генератор кода использует интерфейс LAPACKE C для LAPACK. Если указано, что требуется генерировать вызовы LAPACK, а входные массивы для функций линейной алгебры соответствуют определенным критериям, генератор кода создает вызовы LAPACK. В противном случае генератор кода создает код для функций линейной алгебры.
Генератор кода использует указанную библиотеку LAPACK. Укажите библиотеку LAPACK, оптимизированную для среды выполнения. См. www.netlib.org/lapack/faq.html#_what_and_where_are_the_lapack_vendors_implementations.
Для генерации вызовов LAPACK необходимо иметь доступ к классу обратного вызова LAPACK. Класс обратного вызова LAPACK определяет библиотеку LAPACK и файл заголовка LAPACKE для вызовов LAPACK. Чтобы указать, что требуется генерировать вызовы LAPACK и использовать определенную библиотеку LAPACK, укажите имя класса обратного вызова LAPACK. В диалоговом окне Configuration Parameters установите для параметра Custom LAPACK library callback имя класса обратного вызова, например: useMyLAPACK.
Чтобы указать расположение определенной библиотеки LAPACK и файла заголовка LAPACKE, напишите класс обратного вызова LAPACK. Поделитесь классом обратного вызова с другими пользователями, которые хотят использовать эту библиотеку LAPACK для вызовов LAPACK в сгенерированном коде.
Класс обратного вызова должен быть производным от абстрактного класса coder.LAPACKCallback. Используйте этот пример класса обратного вызова в качестве шаблона.
classdef useMyLAPACK < coder.LAPACKCallback methods (Static) function hn = getHeaderFilename() hn = 'mylapacke_custom.h'; end function updateBuildInfo(buildInfo, buildctx) buildInfo.addIncludePaths(fullfile(pwd,'include')); libName = 'mylapack'; libPath = fullfile(pwd,'lib'); [~,linkLibExt] = buildctx.getStdLibInfo(); buildInfo.addLinkObjects([libName linkLibExt], libPath, ... '', true, true); buildInfo.addDefines('HAVE_LAPACK_CONFIG_H'); buildInfo.addDefines('LAPACK_COMPLEX_STRUCTURE'); buildInfo.addDefines('LAPACK_ILP64'); end end end
Вы должны предоставить getHeaderFilename и updateBuildInfo методы. getHeaderFilename возвращает имя файла заголовка LAPACKE. В примере класса обратного вызова замените mylapacke_custom.h с именем файла заголовка LAPACKE. updateBuildInfo предоставляет информацию, необходимую для процесса построения для связи с библиотекой LAPACK. Используйте код, подобный коду в шаблоне, чтобы указать расположение заголовочных файлов и полное имя пути к библиотеке LAPACK. В примере класса обратного вызова замените mylapack с именем вашей библиотеки LAPACK.
Если компилятор поддерживает только сложные типы данных, представленные в виде структур, включите эти строки в updateBuildInfo способ.
buildInfo.addDefines('HAVE_LAPACK_CONFIG_H'); buildInfo.addDefines('LAPACK_COMPLEX_STRUCTURE');
Необходимо указать целочисленный тип, используемый библиотекой LAPACK. Если не указать этот целочисленный тип, это может привести к неправильному поведению или сбоям. Выполните одно из следующих действий:
Включить эти строки в updateBuildInfo способ.
buildInfo.addDefines('HAVE_LAPACK_CONFIG_H'); buildInfo.addDefines('LAPACK_ILP64');
Кроме того, можно непосредственно указать целочисленный тип, используемый библиотекой LAPACK. Например, если целочисленный тип long long, включить эту строку в updateBuildInfo способ.
buildInfo.addDefines('lapack_int=long long');
В этом примере показано, как создать код, вызывающий функции LAPACK в определенной библиотеке LAPACK. В этом примере предположим, что класс обратного вызова LAPACK useMyLAPACK задает нужную библиотеку LAPACK.
Создание модели Simulink ®.
Добавьте в модель функциональный блок MATLAB.
В блоке MATLAB Function добавьте код, вызывающий функцию линейной алгебры. Например, добавьте функцию mysvd который вызывает функцию MATLAB ®svd.
function s = mysvd(A) %#codegen s = svd(A); end
Добавьте блок константы слева от блока функции MATLAB. Задайте значение zeros(500).
Добавьте блок Outport справа от блока MATLAB Function.
Подключите блоки.

Установите для параметра Configuration Parameters > Code Generation > Advanced parameters > Custom LAPACK library callback значение useMyLAPACK.
Класс обратного вызова должен находиться в пути MATLAB.
Создайте модель.
Если вход в mysvd достаточно большой, генератор кода производит вызов LAPACK для svd. Пример вызова функции библиотеки LAPACK для svd является:
info_t = LAPACKE_dgesvd( ...
LAPACK_COL_MAJOR, 'N', 'N', (lapack_int)500, ...
(lapack_int)500, &A[0], (lapack_int)500, &S[0], ...
NULL, (lapack_int)1, NULL,(lapack_int)1, &superb[0]);Библиотека LAPACK должна быть доступна в среде выполнения. Если библиотека LAPACK является общей, используйте переменные среды или параметры компоновщика, чтобы указать расположение библиотеки LAPACK.
На платформе Windows ® измените переменную среды PATH.
На платформе Linux ® измените переменную среды LD_LIBRARY_PATH или используйте rpath вариант компоновщика.
На платформе macOS измените переменную среды DYLD_LIBRARY_PATH или используйте rpath вариант компоновщика.
Чтобы указать rpath linker, можно использовать информацию о построении addLinkFlags метод в updateBuildInfo метод вашего coder.LAPACKCallback класс. Например, для компилятора GCC:
buildInfo.addLinkFlags(sprintf('-Wl,-rpath,"%s"',libPath));