Задайте заменяющие отображения кода

После того, как вы подготовитесь к разработке библиотеки, используйте свои требования, чтобы задать заменяющие отображения кода. Заменяющее отображение кода сопоставляет концептуальное представление функции или оператора, который знаком генератору кода с представлением пользовательской реализации, которое задает C или заменяющего прототипа функции C++. Вы получаете отображение как запись в заменяющей таблице кода:

  • В интерактивном режиме, при помощи Заменяющего Инструмента Кода.

  • Программно, при помощи интерфейса программирования MATLAB®.

Выберите подход для определения заменяющих отображений кода

В следующей таблице перечислены ситуации, чтобы помочь вам решить, когда использовать интерактивный или программируемый подход.

СитуацияПодход
Определение отображений впервые.Заменяющий инструмент кода.
Отображения быстрого прототипирования.Заменяющий Инструмент кода, чтобы быстро сгенерировать, укажите и протестируйте отображения.
Разработка отображения как шаблон или отправная точка для определения подобных отображений.Заменяющий Инструмент кода, чтобы сгенерировать код определения, который можно скопировать и изменить.
Изменение регистрационного файла, включая копирование и вставку содержимого.Редактор MATLAB, чтобы обновить интерфейс программирования непосредственно.
Задавая отображения, которые задают атрибуты, не доступные от Заменяющего Инструмента Кода (например, наборы параметров алгоритма).Интерфейс программирования.
Многократное использование существующего кода для новых отображений путем копирования, вставляя и редактируя существующие отображения.Интерфейс программирования.

Задайте отображения в интерактивном режиме с заменяющим инструментом кода

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

Откройте заменяющий инструмент кода

Выполнить одно из следующих действий:

  • В Командном окне введите команду crtool.

  • В диалоговом окне Configuration Parameters перейдите к панели Code Generation. В разделе Advanced parameters прокрутите вниз и нажмите кнопку Custom CRL....

Лицензия Embedded Coder® не требуется, чтобы создавать заменяющую библиотеку пользовательского кода. Однако у вас должна быть лицензия Embedded Coder, чтобы пользоваться такой библиотекой.

По умолчанию, отображения инструмента, слева направо, корневая панель, панель списка и диалоговая панель. Можно управлять отображением:

  • Перетащите контуры, чтобы расширить, сузить, сократить, или удлинить панели и изменить размер столбцов таблицы.

  • Выберите View> Show dialog pane, чтобы скрыть или отобразить самую правую панель.

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

  • Щелкните правой кнопкой по заголовку столбца таблицы и выберите Hide, чтобы удалить столбец из отображения. (Вы не можете скрыть столбец Name.)

Составьте заменяющую таблицу кода

  1. В окне Code Replacement Tool выберите File> New table.

  2. На правой панели назовите таблицу и нажмите Apply. Позже, когда вы сохранили таблицу, инструмент использует имя таблицы, которое вы задаете, чтобы назвать файл. Например, если вы вводите имя my_sinfcn, инструмент называет файл my_sinfcn.m.

Создайте записи таблицы

Создайте одну или несколько записей таблицы. Каждая запись сопоставляет концептуальное представление функции или оператора к вашему представлению реализации. Информация, которую вы вводите, зависит от типа записи, которую вы создаете. Введите следующую информацию:

  1. На левой панели выберите таблицу, в которую вы хотите добавить запись.

  2. Выберите File> New entry> entry-type, где entry-type является одним из:

    • Математическая операция

    • Функция

    • Операция BLAS

    • Операция CBLAS

    • Сетевая наклонная операция фиксированной точки

    • Семафорная запись

    • Запись индивидуальной настройки

    Новая запись появляется в средней панели, первоначально без имени.

  3. В средней панели выберите новую запись.

  4. На правой панели, на вкладке Mapping Information, из меню Function или Operation, выбирают функцию или операцию, которую вы хотите, чтобы генератор кода заменил. Независимо от типа записи сделайте выбор из этого меню. Ваш выбор определяет то, что другую информацию вы задаете.

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

  5. При появлении соответствующего запроса укажите дополнительную информацию записи, которую вы хотите, чтобы генератор кода использовал при поиске соответствия. Например, когда вы выбираете операцию сложения или операцию вычитания, инструмент предлагает вам задавать алгоритм (Cast before operation или Cast after operation).

  6. Рассмотрите концептуальную информацию об аргументе, которую инструмент заполняет для функции или операции. Концептуальные аргументы ввода и вывода представляют аргументы для функции или заменяемого оператора. Концептуальные аргументы наблюдают соглашения о присвоении имен ('y1', 'u1', 'u2'...) и типы данных, знакомые генератору кода.

    При проверке записи генератор кода подтверждает тот каждый концептуальный аргумент, имеет тип ввода-вывода, который совместим с именем аргумента. Например, вход должен иметь IOType RTW_IO_INPUT.

    Если вы не хотите, чтобы типы данных для вашей реализации совпали с концептуальными типами аргумента, снимите флажок Make the conceptual and implementation argument types the same. Например, большинство ФУНКЦИЙ ANSI C работает с и возвращает данные double. Снимите флажок, если хотят сопоставить концептуальное представление функции к представлению реализации, которое задает значение аргумента и возвращаемое значение. Например, снимите флажок, чтобы сопоставить концептуальное представление функционального sin к представлению реализации, которое задает значение аргумента и возвращаемое значение типа single (single sin(single)) типа double (double sin(double). В этом случае генератор кода производит следующий код:

    y = (single) sin(u1);

    Если вы выбираете Custom для функциональной записи, указываете только концептуальную информацию аргумента.

  7. Задайте имя и информацию об аргументе для вашей заменяющей функции. При вводе информацию и нажимаете Apply, инструмент обновляет Function signature preview.

    При проверке записи генератор кода подтверждает тот каждый аргумент реализации, имеет тип ввода-вывода, который совместим с концептуальным аргументом, с которым это сопоставлено. Например, концептуальный аргумент типа RTW_IO_OUTPUT требует совместимого аргумента реализации типа RTW_IO_OUTPUT или RTW_IO_INPUT_OUTPUT. Типом ввода-вывода по умолчанию является RTW_IO_INPUT.

  8. Задайте дополнительные атрибуты реализации, которые применяются. Например, в зависимости от типа и имени записи, которую вы задаете, инструмент предлагает вам задавать:

    • Целочисленный режим насыщения

    • Округление режимов

    • Позволить ли входные параметры, которые включают выражения

    • Изменяет ли функция внутреннее или глобальное состояние

  9. Нажмите Apply.

Подтвердите таблицы и записи

Заменяющий Инструмент Кода обеспечивает способ подтвердить синтаксис заменяющих таблиц кода и записей таблицы, когда вы задаете их. Если инструмент находит ошибки валидации, можно обратиться к ним и повторить валидацию. Повторите процесс, пока инструмент не сообщит об ошибках.

КСделать
Подтвердите записи таблицыВыберите запись, прокрутку к нижней части вкладки Mapping Information, и нажмите Validate entry. Также выберите одну или несколько записей, щелкните правой кнопкой и выберите Validate entries.
Подтвердите таблицуВыберите таблицу. Затем выберите Actions> Validate table.

Сохраните таблицу

Когда вы сохранили таблицу, инструмент подтверждает неподтвержденное содержимое.

  1. Выберите File> Save table.

  2. В диалоговом окне Browse For Folder задайте местоположение и имя для файла. Как правило, вы выбираете местоположение на пути MATLAB. По умолчанию инструмент называет файл с помощью имени, которое вы задаете для таблицы с дополнительным .m.

  3. Нажмите Save.

Откройте и измените таблицы

После того, чтобы сохранить заменяющую таблицу кода, чтобы внести изменения в таблице:

  1. Выберите File> Open table.

  2. В диалоговом окне файла Импорта просмотрите к файлу MATLAB, который содержит таблицу.

Повторите последовательность, чтобы открыться и работать над несколькими таблицами.

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

  • Создайте новые записи таблицы.

  • Удалите записи.

  • Скопируйте и вставьте или вырежьте и вставьте информацию между таблицами.

Задайте отображения программно

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

  • Изменение таблиц, которые вы составляете с Заменяющим Инструментом Кода.

  • Определение отображений для специализированных записей, которые вы не можете создать с Заменяющим Инструментом Кода.

  • Тиражирование и изменение подобных записей и таблиц.

Шаги для определения отображения программно:

Составьте заменяющую таблицу кода

  1. Создайте табличный файл определения, который содержит функциональное определение. Например:

    function hTable = crl_table_sinfcn()
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

    hTable = RTW.TflTable;

Создайте запись таблицы

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

  1. В теле табличного файла определения создайте заменяющий объект записи кода. Вызовите одну из следующих функций.

    Тип записиФункция
    Математическая операцияRTW.TflCOperationEntry
    ФункцияRTW.TflCFunctionEntry
    Операция BLASRTW.TflBlasEntryGenerator
    Операция CBLASRTW.TflCBlasEntryGenerator
    Операции сложения фиксированной точки и операции вычитания (поддерживают для SlopesMustBeTheSame и параметров MustHaveZeroNetBias),RTW.TflCOperationEntryGenerator
    Сетевая наклонная операция фиксированной точкиRTW.TflCOperationEntryGenerator_NetSlope
    Семафор или взаимоисключающая записьRTW.TflCSemaphoreEntry
    Пользовательская функциональная записьMyCustomFunctionEntry (где MyCustomFunctionEntry является классом, выведенным от RTW.TflCFunctionEntryML),
    Пользовательская запись операцииMyCustomOperationEntry (где MyCustomOperationEntry является классом, выведенным от RTW.TflCOperationEntryML),

    Например:

    hEnt = RTW.TflCFunctionEntry;

Можно объединить шаги создания записи, установки параметров записи, концептуального создания и аргументы реализации и добавление записи в таблицу с одним вызовом функции к registerCFunctionEntry, registerCPPFunctionEntry или registerCPromotableMacroEntry, если вы создаете запись для функции, и реализация функции соответствует следующим критериям:

  • Имена аргумента реализации и порядок совпадают с именами и порядком соответствующих концептуальных аргументов.

  • Входные параметры имеют тот же тип.

  • Возврат и имена входного параметра следуют соглашениям о присвоении имен генератора кода по умолчанию:

    • Возвращаемым аргументом является y1.

    • Входными параметрами является u1, u2..., un.

Например:

registerCFunctionEntry(hTable, 100, 1, 'sin', 'double', ...
   'sin_dbl', 'double', 'sin_dbl.h','','');

Как другая альтернатива, можно значительно уменьшать объем кода, который вы пишете путем объединения шагов создания записи и концептуальный и аргументы реализации с вызовом функции createCRLEntry. В этом случае укажите концептуальную информацию и информацию о реализации как вектор символов или представьте скалярные спецификации в виде строки.

Например:

hEnt = createCRLEntry(hTable, ...
    'double y1 = sin(double u1)', ...
    'mySin');

Этот подход не поддерживает:

  • Реализации C++

  • Выравнивание данных

  • Замена оператора с сетевыми наклонными аргументами

  • Спецификации параметра записи (например, приоритет, алгоритм, создавая информацию)

  • Семафор и взаимоисключающие замены функции

Установите параметры записи

Установите параметры записи, такие как приоритет, информация об алгоритме и реализация (замена) имя функции. Вызовите функцию, перечисленную в следующей таблице для типа записи, который вы создали.

Тип записиФункция
Математическая операцияsetTflCOperationEntryParameters
ФункцияsetTflCFunctionEntryParameters
Операция BLASsetTflCOperationEntryParameters
Операция CBLASsetTflCOperationEntryParameters
Операции сложения фиксированной точки и операции вычитания, где существует отображение many-one, такое как отображение для области значений фиксированных точек к той же заменяющей функции (поддержка SlopesMustBeTheSame и параметров MustHaveZeroNetBias)setTflCOperationEntryParameters
Сетевая наклонная операция фиксированной точкиsetTflCOperationEntryParameters
Семафор или взаимоисключающая записьsetTflCSemaphoreEntryParameters
Пользовательская функциональная записьsetTflCFunctionEntryParameters
Пользовательская запись операцииsetTflCOperationEntryParameters

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

hEnt = RTW.TflCFunctionEntry
hEnt = 

  TflCFunctionEntry with properties:

              Implementation: [1x1 RTW.CImplementation]
         SlopesMustBeTheSame: 0
           BiasMustBeTheSame: 0
             AlgorithmParams: []
                    ImplType: 'FCN_IMPL_FUNCT'
       AdditionalHeaderFiles: {0x1 cell}
       AdditionalSourceFiles: {0x1 cell}
      AdditionalIncludePaths: {0x1 cell}
       AdditionalSourcePaths: {0x1 cell}
          AdditionalLinkObjs: {0x1 cell}
     AdditionalLinkObjsPaths: {0x1 cell}
         AdditionalLinkFlags: {0x1 cell}
      AdditionalCompileFlags: {0x1 cell}
                 SearchPaths: {0x1 cell}
                         Key: ''
                    Priority: 100
                 ArrayLayout: 'COLUMN_MAJOR'
              ConceptualArgs: [0x1 handle]
                   EntryInfo: []
                 GenCallback: ''
                 GenFileName: ''
              SaturationMode: 'RTW_SATURATE_UNSPECIFIED'
               RoundingModes: {'RTW_ROUND_UNSPECIFIED'}
          TypeConversionMode: 'RTW_EXPLICIT_CONVERSION'
             AcceptExprInput: 1
                 SideEffects: 0
                  UsageCount: 0
          RecordedUsageCount: 0
                 Description: ''
    StoreFcnReturnInLocalVar: 0
     AllowShapeAgnosticMatch: 0
                TraceManager: [1x1 RTW.TflTraceManager]

Видеть параметры реализации, введите:

hEnt.Implementation
ans = 

  CImplementation with properties:

            HeaderFile: ''
            SourceFile: ''
            HeaderPath: ''
            SourcePath: ''
                Return: []
        StructFieldMap: []
                  Name: ''
             Arguments: [0x1 RTW.Argument]
    ArgumentDescriptor: []

Например, чтобы установить параметры записи для sin функционируют и называют вашу заменяющую функцию sin_dbl, используют следующий вызов функции:

setTflCFunctionEntryParameters(hEnt, ...
          'Key', 'sin', ...
          'ImplementationName', 'sin_dbl');

Создайте концептуальные аргументы

Создайте концептуальные аргументы и добавьте их в массив записи концептуальных аргументов.

  • Задайте выходные аргументы перед входными параметрами.

  • Задайте имена аргумента, которые выполняют соглашения о присвоении имен аргумента генератора кода:

    • y1 для возвращаемого аргумента

    • u1, u2..., un для входных параметров

  • Задайте типы данных, которые знакомы генератору кода.

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

  • Генератор кода определяет размер значения для аргумента с неразмерным типом, таким как целое число, на основе параметров конфигурации аппаратной реализации.

Для каждого аргумента:

  1. Идентифицируйте, является ли аргумент для ввода или вывода, имени и типа данных. Если вы не знаете, что аргументы задать для поддерживаемой функции или операции, используйте Заменяющий Инструмент Кода, чтобы найти их. Например, чтобы найти концептуальные аргументы для функции sin, откройте инструмент, составьте таблицу, создайте функциональную запись, и в Function меню выбирает sin.

    При проверке записи генератор кода подтверждает тот каждый концептуальный аргумент, имеет тип ввода-вывода, который совместим с именем аргумента. Например, вход должен иметь IOType RTW_IO_INPUT.

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

    ЕслиЗатем
    Вы хотите более простой код или хотите явным образом задать, является ли аргумент скаляром или нескалярный (вектор или матрица).

    Вызовите функциональный createAndAddConceptualArg. Например:

    createAndAddConceptualArg(hEnt, ...
        'RTW.TflArgNumeric', ...
        'Name',         'y1',...
        'IOType',       'RTW_IO_OUTPUT',...
        'DataTypeMode', 'double');

    Второй аргумент задает, является ли аргумент скаляром (RTW.TflArgNumeric orRTW.TflArgMatrix).

    Вы хотите создать аргумент на основе встроенного определения аргумента (например, скаляр или нескалярный).

    Вызовите getTflArgFromString, чтобы создать аргумент. Затем вызовите addConceptualArg, чтобы добавить аргумент в запись.

    arg = getTflArgFromString(hEnt, 'y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    addConceptualArg(hEnt, arg);
    Необходимо задать несколько подобных отображений, вы хотите минимизировать код, чтобы записать, и записи не требуют выравнивания данных, используют сетевые наклонные аргументы или включают взаимоисключающие замены или семафор.

    Вызовите createCRLEntry, чтобы создать запись и задать концептуальный и аргументы реализации в одном вызове функции.

    hEnt = createCRLEntry(hTable, ...
        'double y1 = sin(double u1)', ...
        'mySin');

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

% Conceptual Args

arg = getTflArgFromString(hEnt, 'y1','double');
arg.IOType = 'RTW_IO_OUTPUT';
addConceptualArg(hEnt, arg);

arg = getTflArgFromString(hEnt, 'u1','double');
addConceptualArg(hEnt, arg);

Создайте аргументы реализации

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

  • Когда заменяющий код, генератор кода использует имена аргумента, чтобы определить, как это передает данные функции реализации.

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

  • Для замен оператора порядок имен аргумента реализации не должен совпадать с порядком концептуальных имен аргумента. Например, для замены оператора для сложения, y1=u1+u2, концептуальными аргументами является y1, u1 и u2, в том порядке. Если подписью вашей функции реализации является t myAdd(t u2, t u1), где t является допустимым типом C, на основе соответствий имени аргумента, генератор кода передает значение первого концептуального аргумента, u1, к второму аргументу реализации myAdd. Генератор кода передает значение второго концептуального аргумента, u2, к первому аргументу реализации myAdd.

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

Для каждого аргумента:

  1. Идентифицируйте, является ли аргумент для ввода или вывода, имени и типа данных.

    При проверке записи генератор кода подтверждает тот каждый аргумент реализации, имеет тип ввода-вывода, который совместим с концептуальным аргументом, с которым это сопоставлено. Например, концептуальный аргумент типа RTW_IO_OUTPUT требует совместимого аргумента реализации типа RTW_IO_OUTPUT или RTW_IO_INPUT_OUTPUT. Типом ввода-вывода по умолчанию является RTW_IO_INPUT.

  2. Создайте и добавьте аргумент реализации в запись. Можно выбрать метод из методов, перечисленных в этой таблице.

    ЕслиЗатем
    Вы хотите заполнить аргументы реализации как копии ранее созданных соответствующих концептуальных аргументов

    Вызовите функциональный copyConceptualArgsToImplementation. Например:

    copyConceptualArgsToImplementation(hEnt);
    Вы хотите создать и добавить аргументы реализации индивидуально или отличаться атрибуты аргумента, при поддержании концептуального порядка аргументов

    Вызовите функции createAndSetCImplementationReturn andcreateAndAddImplementationArg. Например:

    createAndSetCImplementationReturn(hEnt, 
        'RTW.TflArgNumeric', ...
        'Name',       'y1', ...
        'IOType',     'RTW_IO_OUTPUT', ...
        'IsSigned',   true, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(op_entry, 
        'RTW.TflArgNumeric',...
        'Name',       'u1', ...
        'IOType',     'RTW_IO_INPUT',...
        'IsSigned',   true,...
        'WordLength', 32, ...
        'FractionLength', 0 );
    Вы хотите минимизировать объем кода или задать аргументы константы, чтобы передать функции реализации

    Создайте аргумент с вызовом функционального getTflArgFromString. Затем используйте удобный метод setReturn или addArgument, чтобы задать, является ли аргумент возвращаемым значением или аргументом и добавить аргумент в массив записи аргументов реализации. Например:

    arg = getTflArgFromString(hEnt,...
        'y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEnt.Implementation.setReturn(arg);
    
    arg = getTflArgFromString(hEnt,...
        'u1','double');
    hEnt.Implementation.addArgument(arg);

    Следующий вызов getTflArgFromString передает постоянный 0 аргументу u2:

    arg = getTflArgFromString(hEnt,...
        'u2', 'int16', 0)
    hEnt.Implementation.addArgument(arg);

    Для семафора и взаимоисключающих записей, используйте функции getTflDWorkFromString и addDWorkArg, чтобы создать и добавить аргумент DWork в запись. Затем создайте аргументы реализации как показано выше с getTflArgFromString и удобными методами setReturn и addArgument. Например:

    arg = getTflDWorkFromString(...
        'd1', 'void*')
    hEnt.addDWorkArg(arg);
    
    arg = hEnt.getTflArgFromString(...
        'y1', 'void');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEnt.Implementation.setRetrurn(arg);
    
    arg = hEnt.getTflArgFromString(...
        'u1', 'integer');
    hEnt.Implementation.addArgument(arg);
    
    arg = hEnt.getTflArgFromString(...
        'd1', 'void**');
    hEnt.Implementation.addArgument(arg);
    Необходимо задать несколько подобных отображений, вы хотите минимизировать код, чтобы записать, и записи не требуют выравнивания данных, используют сетевые наклонные аргументы или включают взаимоисключающие замены или семафор.

    Вызовите createCRLEntry, чтобы создать запись и задать концептуальный и аргументы реализации в одном вызове функции.

    hEnt = createCRLEntry(hTable, ...
        'double y1 = sin(double u1)', ...
        'mySin');

    Следующий код показывает третий подход, перечисленный в таблице для определения выходного аргумента реализации и определений входного параметра для функции sin:

    % Implementation Args 
    
    arg = hEnt.getTflArgFromString('y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEnt.Implementation.setReturn(arg); 
    
    arg = hEnt.getTflArgFromString('u1','double');
    hEnt.Implementation.addArgument(arg);

Добавьте запись в таблицу

Добавьте запись в заменяющую таблицу кода путем вызова функционального addEntry.

addEntry(hTable, hEnt); 

Подтвердите запись

После того, как вы создаете или изменяете заменяющую запись таблицы кода, подтверждаете ее путем вызова ее в командной строке MATLAB. Например:

hTbl = crl_table_sinfcn
hTbl =

RTW.TflTable
    Version: '1.0'
    AllEntries: [2x1 RTW.TflCFunctionEntry]
    ReservedSymbols: []
    StringResolutionMap: []

Если таблица включает ошибки, MATLAB сообщает о них. Следующие примеры показывают, как MATLAB сообщает об опечатке в имени типа данных:

hTbl = crl_table_sinfcn
??? RTW_CORE:tfl:TflTable: Unsupported data type, 'dooble'.

Error in ==> crl_table_sinfcn at 7
hTable.registerCFunctionEntry(100, 1, 'sin', 'dooble', 'sin_dbl', ...

Сохраните таблицу

Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл, например, crl_table_sinfcn.m.

Затем, от ваших требований, определите, необходимо ли указать информацию сборки для заменяющего кода.

Похожие темы