Я обучил нейронную сеть на панели инструментов Matlab «Распознавание образов нейронной сети» и сгенерировал функцию .m из панели инструментов. Я также написал свою собственную функцию, которая получает набор данных, содержащий матрицу inf x 5 с входными данными, вызывает функцию NN из панели инструментов и возвращает вектор с распознанным шаблоном и процентным значением. (входная матрица содержит шаблон, который должен быть обнаружен)
Поскольку мне нужно запустить код на Arduino, я попытался использовать Matlab Coder для генерации кода C ++, но он не работает. Во-первых, я получаю предупреждение о том, что arrayfun не поддерживается для генерации кода (вызов функции arrayfun находится в сгенерированной функции из набора инструментов). После этого я определил ввод функции как «double (: 7351 x 5)» (это до 7351, потому что мой набор данных для обучения такой большой).
Теперь кодер создает MEX-файл для проверки проблем во время выполнения, и там возникают некоторые ошибки.
Я не знаю, почему целевой журнал сборки на немецком языке, потому что остальная часть Matlab на английском языке, но, как правило, некоторые скобки и точки с запятой отсутствуют, но почему? Как могут отсутствовать скобки в файле matrix.h или amlrt.h ???
1 cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "C:\PROGRA~1\MATLAB\R2016a\simulink\include" /I "C:\PROGRA~1\MATLAB\R2016a\toolbox\shared\simtargets" /I "C:\Users\Kai\Desktop\YUN_SI~1" /I "C:\Users\Kai\Desktop\YUN_SI~1\codegen\mex\NeuralNetwork" /I ".\interface" /I "C:\PROGRA~1\MATLAB\R2016a\extern\include" /I "." "NeuralNetwork_data.c"2 NeuralNetwork_data.c
3 c:\program files\matlab\r2016a\extern\include\matrix.h(260) : error C2061: Syntaxfehler: Bezeichner 'mxChar'
4 c:\program files\matlab\r2016a\extern\include\matrix.h(260) : error C2059: Syntaxfehler: ';'
5 c:\program files\matlab\r2016a\extern\include\matrix.h(605) : error C2143: Syntaxfehler: Es fehlt '{' vor '*'
6 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(56) : error C2143: Syntaxfehler: Es fehlt ')' vor '*'
7 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(56) : error C2143: Syntaxfehler: Es fehlt '{' vor '*'
8 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(56) : error C2373: 'emlrtCTX': Neudefinition; unterschiedliche Modifizierer
9 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(50): Siehe Deklaration von 'emlrtCTX'
10 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(56) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'aTLS'
11 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(56) : error C2059: Syntaxfehler: ')'
12 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(133) : error C2061: Syntaxfehler: Bezeichner 'EmlrtErrorFunction'
13 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(139) : error C2059: Syntaxfehler: '}'
14 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(194) : error C2061: Syntaxfehler: Bezeichner 'emlrtContextGlobal'
15 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(194) : error C2059: Syntaxfehler: ';'
16 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(808) : error C2143: Syntaxfehler: Es fehlt ')' vor '*'
17 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(808) : error C2143: Syntaxfehler: Es fehlt '{' vor '*'
18 C:\PROGRA~1\MATLAB\R2016a\extern\include\emlrt.h(808) : error C2059: Syntaxfehler: ')'
19 c:\users\kai\desktop\yun_simulink\codegen\mex\neuralnetwork\NeuralNetwork_data.h(32) : error C2061: Syntaxfehler: Bezeichner 'emlrtContextGlobal'
20 c:\users\kai\desktop\yun_simulink\codegen\mex\neuralnetwork\NeuralNetwork_data.h(32) : error C2059: Syntaxfehler: ';'
21 NeuralNetwork_data.c(22) : error C2061: Syntaxfehler: Bezeichner 'emlrtContextGlobal'
22 NeuralNetwork_data.c(22) : error C2059: Syntaxfehler: ';'
23 NeuralNetwork_data.c(22) : error C2513: '/*global*/ ': Keine Variable vor '=' deklariert
24 gmake: *** [NeuralNetwork_data.obj] Error 2
В целом, можно создать код C ++ из набора инструментов NN, но почему он не работает в моем случае?
Функция, которую я хочу перевести на c ++:
function [ activity, percent ] = NeuralNetwork( Data )
%NN for recogniton of activitys standing, sitting, walking from Accelerometer data, relative error
%is returned in percent
% input Data contains 5 columns. 1. col -> time; 2-4.col ->
% x,y,z-Acceleration; 5.col -> activity
% VAR activity contains 1 for walking, 2 for sitting and 3 for standingAcceleration_data = Data(:,2:4); %store acceleration data in a matrix
Acceleration_data = Acceleration_data'; %NN input expects transposed matrix
targets = Data(:,5); %activity that should be detected from the NN
targets = targets'; %output of NN is also transposed
NNfit = myNeuralNetworkFunction(Acceleration_data); %call the trained NN
NNfit = round(NNfit); %output can be e.g. 0.998 -> round to 1
activity=zeros(1,length(NNfit)); %allocate memory for cpp-codefor i=1:length(NNfit) %NNfit is a 3D matrix, after round one
[val pos] = max(NNfit(:,i)); %element is 1 the other are 0 the number of
%the row represents the activity
activity(i) = pos; %vektor containing the activity
end
cnt=0; %calc percent of correct recognized data points
for i=1:length(NNfit)
if activity(i) == targets(i)
cnt = cnt+1; %amound of correct recognized data points
end
end
percent = (cnt/length(targets))*100; %calc percent
end
редактировать:
Файл NeuralNetwork_data.c:
/* Include files */
#include "rt_nonfinite.h"#include "NeuralNetwork.h"#include "NeuralNetwork_data.h"#include "blas.h"
/* Variable Definitions */
emlrtCTX emlrtRootTLSGlobal = NULL;
const volatile char_T *emlrtBreakCheckR2012bFlagVar = NULL;
covrtInstance emlrtCoverageInstance;
emlrtContext emlrtContextGlobal = { true, false, 131434U, NULL, "NeuralNetwork",
NULL, false, { 2045744189U, 2170104910U, 2743257031U, 4284093946U }, NULL };
emlrtRSInfo f_emlrtRSI = { 68, "eml_mtimes_helper",
"C:\\Program Files\\MATLAB\\R2016a\\toolbox\\eml\\lib\\matlab\\ops\\eml_mtimes_helper.m"};
emlrtRSInfo g_emlrtRSI = { 85, "xgemm",
"C:\\Program Files\\MATLAB\\R2016a\\toolbox\\eml\\eml\\+coder\\+internal\\+blas\\xgemm.m"};
emlrtRSInfo n_emlrtRSI = { 214, "minOrMax",
"C:\\Program Files\\MATLAB\\R2016a\\toolbox\\eml\\eml\\+coder\\+internal\\minOrMax.m"};
emlrtRSInfo o_emlrtRSI = { 375, "minOrMax",
"C:\\Program Files\\MATLAB\\R2016a\\toolbox\\eml\\eml\\+coder\\+internal\\minOrMax.m"};
emlrtRSInfo p_emlrtRSI = { 347, "minOrMax",
"C:\\Program Files\\MATLAB\\R2016a\\toolbox\\eml\\eml\\+coder\\+internal\\minOrMax.m"};
/* End of code generation (NeuralNetwork_data.c) */
Задача ещё не решена.
Других решений пока нет …