cell2mat не поддерживается для генерации кода C в MATLAB Coder

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

cell2mat не поддерживается для генерации кода arrayfun не поддерживается для генерации кода

Чем заменить эти функции?

Мой код приведен ниже. Вход X — это матрица 1x2500, а output — матрица 1x6.

Полный код доступен по этой ссылке boneGrwNN.

function Y = boneGrwNN(X)
x1_step1.ymin = -1;    
% ===== SIMULATION ========    
% Format Input Arguments
isCellX = iscell(X);
if ~isCellX, X = {X}; end;    
% Dimensions
TS = size(X,2); % timesteps
if ~isempty(X)
    Q = size(X{1},1); % samples/series
else
    Q = 0;
end    
% Allocate Outputs
Y = cell(1,TS);    
% Time loop
for ts=1:TS        
    % Input 1
    X{1,ts} = X{1,ts}';
    Xp1 = mapminmax_apply(X{1,ts},x1_step1);        
    % Layer 1
    a1 = tansig_apply(repmat(b1,1,Q) + IW1_1*Xp1);        
    % Layer 2
    a2 = softmax_apply(repmat(b2,1,Q) + LW2_1*a1);        
    % Output 1
    Y{1,ts} = a2;
    Y{1,ts} = Y{1,ts}';
end   
% Format Output Arguments
if ~isCellX, Y = cell2mat(Y); end
end

% ===== MODULE FUNCTIONS ========    
% Map Minimum and Maximum Input Processing Function
function y = mapminmax_apply(x,settings)
y = bsxfun(@minus,x,settings.xoffset);
y = bsxfun(@times,y,settings.gain);
y = bsxfun(@plus,y,settings.ymin);
end    
% Competitive Soft Transfer Function
function a = softmax_apply(n,~)
if isa(n,'gpuArray')
    a = iSoftmaxApplyGPU(n);
else
    a = iSoftmaxApplyCPU(n);
end
end
function a = iSoftmaxApplyCPU(n)
nmax = max(n,[],1);
n = bsxfun(@minus,n,nmax);
numerator = exp(n);
denominator = sum(numerator,1);
denominator(denominator == 0) = 1;
a = bsxfun(@rdivide,numerator,denominator);
end
function a = iSoftmaxApplyGPU(n)
nmax = max(n,[],1);
numerator = arrayfun(@iSoftmaxApplyGPUHelper1,n,nmax);
denominator = sum(numerator,1);
a = arrayfun(@iSoftmaxApplyGPUHelper2,numerator,denominator);
end
function numerator = iSoftmaxApplyGPUHelper1(n,nmax)
numerator = exp(n - nmax);
end
function a = iSoftmaxApplyGPUHelper2(numerator,denominator)
if (denominator == 0)
    a = numerator;
else
    a = numerator ./ denominator;
end
end

% Sigmoid Symmetric Transfer Function
function a = tansig_apply(n,~)
a = 2 ./ (1 + exp(-2*n)) - 1;
end

Как я могу сгенерировать код C для этой функции?


person manoos    schedule 19.12.2017    source источник
comment
Если вы понимаете, что делает cell2mat, и понимаете, какие входные данные вы ему передаете, то почему вы не можете вручную воспроизвести поведение, не используя сам cell2mat?   -  person Wolfie    schedule 19.12.2017


Ответы (1)


Вы можете сгенерировать автономный код C только из функции, поддерживаемые генерацией кода. Если вам действительно нужен код C, потому что ваша среда не поддерживает Matlab, вам придется вручную преобразовать неподдерживаемые функции или использовать coder.ceval, чтобы использовать внешний код C, реализующий те же функции.

В вашем примере вы можете заменить вызовы arrayfun традиционными вызовами for-loops. Чтобы реализовать свой собственный код cell2mat, просто введите open cell2mat, чтобы просмотреть исходный код функции и попытаться воспроизвести ее логику в своем коде.

person Tommaso Belluzzo    schedule 19.12.2017