Определение входных данных переменного размера для Matlab Coder

Я пытаюсь создать файл кода mex из файла .m с помощью кодера Matlab. Код, для которого

function [result,x]=tesrank(A,x)

result = [];
n = x;
for col= 1:n
   result = [result, sum(A==col, 2)];
end

Для фиксированного размера я могу получить его, используя

codegen tesrank -args {zeros(2,3), zeros(1)}
% Here size(A)=2x3 and size(x)=1x1

Как мне это сделать, не ограничивая размер A и x?


person Zero    schedule 14.08.2013    source источник
comment
Когда я пытаюсь выполнить генерацию кода для этой функции, это не удается. Не могли бы вы проверить?   -  person Lokesh A. R.    schedule 02.12.2013
comment
Вы можете использовать этот тип кодирования для произвольных размеров A и x, если вы зададите верхнюю границу их размеров. См. документацию, указанную пользователем 2987828.   -  person Navan    schedule 05.12.2013


Ответы (3)


Вам не нужно ограничивать размер массива A.

Проверьте этот пример (используя Matlab 2014a):

codegen('funcAccumarray1D_max.m', ...
    '-report', ...
    '-args', {coder.typeof(double(0), [Inf 1]), ...
              coder.typeof(double(0), [Inf 1])}, ...
    '-o', 'funcAccumarray1D_max')

для этой функции:

function [ outs ] = funcAccumarray1D_max(subs, vals, sz) 
%FUNCACCUMARRAY1D_MAX Construct an array by accumulation using 'max'
%#codegen
outs = NaN(sz, 1, 'like', vals);
for ix=1:size(subs,1)
  sub = subs(ix);
  outs(sub,1) = max(outs(sub,1), vals(ix,1));
end
end
person Jens Henrik Göbbert    schedule 28.09.2014

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

codegen tesrank -args {coder.typeof(0, [Inf, Inf]), coder.typeof(0, [1, Inf])}

В моем примере A полностью неограничен в двух измерениях (у вас может быть больше двух, просто увеличьте длину массива размеров до typeof), а x ограничен в первом измерении до размера точно 1, но неограничен во втором измерение. Глядя на ваш код, вы можете не хотеть, чтобы x был неограниченным, но если вы это сделаете, вы это сделаете.

Есть и другие возможности coder.typeof, которые вы можете изучить.

person Tony    schedule 14.04.2015

Вы не можете, согласно страницам p7-15 и p25-24 документации Mathworks .

person user2987828    schedule 02.12.2013