Matlab-кодер: как заставить переменную иметь переменную: inf size - PullRequest
1 голос
/ 30 апреля 2020

Я не могу найти, как заставить кодировщик Matlab сделать размер параметра переменным, а не фиксированным.

Вот MCVE:

Код функции:

function [sz] = my_varsize(x)
    sz = length(x);
end

Пример основной программы, используемой в Matlab-кодере:

samp = 100;
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);

Затем Matlab-кодер генерирует код C / C ++, где размер x равен (1x100).

Я могу вручную изменить размер переменной с 1x100 до 1x:Inf с GUI, это прекрасно работает, но я бы предпочел, чтобы Matlab-кодер делал это автоматически. Я пытался добавить coder.varsize('x',[1,inf]); и coder.typeof(x,[1,inf]); как в функцию, так и в основную программу, но ни один из них не имел ожидаемого поведения.


Редактировать: основываясь на комментарии Райана, я пытался вызвать my_varsize с помощью различные объекты разных размеров, чтобы увидеть, понимает ли Matlab, что в этом случае следует использовать переменный размер:

samp = int64(round(rand()*100));
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);

samp = int64(round(rand()*100));
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);

Затем сгенерированный код использует переменный размер 61 (самый большой результат из двух вызовов rand()) [1,:61], а мне нужно [1,:inf], чтобы мой сгенерированный код C / C ++ можно было использовать с любым вводом!

1 Ответ

0 голосов
/ 02 мая 2020

Предположительно, вы используете возможность автоопределения в приложении MATLAB Coder. Для этого нужно запустить предоставленный вами скрипт и отслеживать входные данные для вашей функции my_varsize. Давайте рассмотрим конкретный пример:

функция my_varsize.m

function [sz] = my_varsize(x)
    sz = length(x);
end

тестовый скрипт my_varsize_tb.m

samp = 20;
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);

samp = 37;
x = zeros(1,samp);
sz = my_varsize(x);
display(sz);

Здесь запускается my_varsize_tb, и кодер обнаруживает 2 вызова на my_varsize. Первый занимает двойной массив 1-by-20. Второй занимает массив 1-by-37. Таким образом, он вычисляет, что ввод должен быть 1-by-:37. Так как таким способом вы можете сделать только конечное количество вызовов, входной сигнал будет определен только с конечной верхней границей.

Затем вы можете настроить размер на 1-by-:Inf в приложении Coder:

Coder app varsize

Дополнительная информация

Существует функция командной строки, которая дает то же поведение, что и вы :

>> t = coder.getArgTypes('my_varsize_tb','my_varsize')

t =

  1×1 cell array

    {1×1 coder.PrimitiveType}

>> t{1}

ans = 

coder.PrimitiveType
   1×:37 double

Аналогичным образом можно настроить этот размер:

>> inputType = coder.resize(t{1},[1,Inf])

inputType = 

coder.PrimitiveType
   1×:inf double
>> codegen my_varsize -args inputType

, чтобы использовать его с командой codegen.

Наконец, учитывая, что у вас есть простая функция Вы можете просто сделать:

t = coder.typeof(1, [1,Inf]);
codegen my_varsize -args t

coder.typeof берет первый вход, чтобы определить, что это реальный double и размер. Когда вы передаете второй аргумент, он переопределяет размер, создавая 1-by-:Inf, как и ожидалось в этом случае.

...