matlab神经网络工具箱生成的代码如何转化成C写进单片机里

本人是做硬件方面的,用到了matlabBP神经网络工具箱,做参数识别。训练好的代码如何转换成C写进单片机?用matlab自带的转换功能,转换不成功


```c
function [Y,Xf,Af] = myNeuralNetworkFunction(X,~,~)
%MYNEURALNETWORKFUNCTION neural network simulation function.
%
% Generated by Neural Network Toolbox function genFunction, 04-Mar-2023 10:33:38.
%
% [Y] = myNeuralNetworkFunction(X,~,~) takes these arguments:
%
%   X = 1xTS cell, 1 inputs over TS timesteps
%   Each X{1,ts} = Qx7 matrix, input #1 at timestep ts.
%
% and returns:
%   Y = 1xTS cell of 1 outputs over TS timesteps.
%   Each Y{1,ts} = Qx3 matrix, output #1 at timestep ts.
%
% where Q is number of samples (or series) and TS is the number of timesteps.

%#ok<*RPMT0>

% ===== NEURAL NETWORK CONSTANTS =====

% Input 1
x1_step1.xoffset = [1.5707963267949;1.618;43.68;6.237;87.1;6.7;84.58];
x1_step1.gain = [1.27323954473516;0.0408229915088178;0.00756658595641646;0.121706322643461;0.00870322019147085;0.683760683760684;0.0541711809317443];
x1_step1.ymin = -1;

% Layer 1
b1 = [0.55494639244498866759;-33.945571610442087263;17.182630767504285529;-0.63400552123759978951;3.754108666703536823;27.270712321367362563;0.014132214582761450788;-1.4208344671843862184;4.2408935308786315233;3.7968722255823230682];
IW1_1 = [-0.88105727510348985643 0.16021845253677324816 1.077226434042114489 0.39416038754170862335 1.3976140669985668286 -2.8120459146041345555 2.7756987125829812868;5.5320045456500919201 3.6544295944302054302 -15.504720845160083087 -2.1026228213056539218 -26.47890107250557179 6.0899082839316367455 -5.732579713106045638;-4.3510600534959094077 4.1372733044436387218 11.376615522366474664 0.77472131123238696659 2.667722977730541345 1.1767704272630929996 1.5591343053094108839;0.46027649801970987875 -0.83316897205170470375 1.4191034700913116584 1.4163399706941559586 -1.6134674246035209944 -2.780526042753581617 2.5461361385861072115;0.82731576195170086763 7.7796562185555027114 -1.4120782610169111404 -4.2231471190480824873 -0.30441830895781535338 5.6453763978445143934 -5.3713272895715640232;-7.9950373378161936344 -12.314288022147048096 22.368045276012047395 9.3165133818085443806 15.194197956634585722 -2.9352876049448424212 5.2084727495759626237;1.3188886862071211858 -0.055185964516098640065 -1.7947595705445711367 1.0307488182466639781 1.3481264626536411111 -1.7514785349626362798 1.0030088748970191759;-1.3286016281713093345 -0.40293053040068754767 0.83484601276347081278 0.44624199702604538942 -1.1270945547893016503 2.5585497244032868736 -1.9564228888744095158;-0.09127701225420009612 -0.88536799458422243969 -0.28869430310385418847 8.5666000248198432843 -3.3813873273187531332 1.2068708708573687716 -1.9287750695479148888;-1.3746837519763144275 5.9899469122038988544 1.4358926408370524808 -3.1605286774659653304 -1.1511369473269379426 1.2878240140491794552 -0.90241726697294311066];

% Layer 2
b2 = [13.518769584688577368;12.347024333398477935;5.5351372133187961566];
LW2_1 = [8.9126750991659040579 15.238481092542471629 -3.9465241625950167048 7.8805918338308291737 10.892578229177956928 7.8736162363044384094 -8.2195676925655032363 -2.264305891551157135 -2.1566746921426140915 -2.1101374105407235682;0.96732950949232932025 11.826566400317700456 -4.5648202451681640923 0.66991883778812966188 1.219913615999492329 6.2876352845473677533 -1.156867885446378974 -0.54792478955624324133 -3.3682250894871663682 -0.43619367456244745318;3.6227014731667748215 7.9195069204175512212 -2.4043677761257495895 3.2651569795174038013 4.5209775996669829823 4.3463937451368597209 -3.6193497352664887323 -3.0454468649940955594 -1.1150257343635074925 -0.83336752142667747112];

% Output 1
y1_step1.ymin = -1;
y1_step1.gain = [0.2;0.0444444444444444;0.0311284046692607];
y1_step1.xoffset = [35;5;61.25];

% ===== 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 = repmat(b2,1,Q) + LW2_1*a1;
    
    % Output 1
    Y{1,ts} = mapminmax_reverse(a2,y1_step1);
    Y{1,ts} = Y{1,ts}';
end

% Final Delay States
Xf = cell(1,0);
Af = cell(2,0);

% 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

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

% Map Minimum and Maximum Output Reverse-Processing Function
function x = mapminmax_reverse(y,settings)
x = bsxfun(@minus,y,settings.ymin);
x = bsxfun(@rdivide,x,settings.gain);
x = bsxfun(@plus,x,settings.xoffset);
end

```

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7666920
  • 这篇博客也不错, 你可以看下机器学习:使用matlab实现神经网络解决数字识别(多元分类)问题
  • 除此之外, 这篇博客: matlab解析单片机发送数据的一种简单方法中的 matlab解析单片机发送数据的一种简单方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 经常使用单片机的同学,应该会经常面对这样一种情况,那就是对单片机采回的某些数据绘图、再处理等应用。大家经常用的两款软件,比如匿名的地面站,它通过固定的数据通讯协议,将数据从下位机传入上位机,上位机根据协议格式对数据解析,反之也一样。另外一种便是以UchartLv2为代表的文本分析类。在单片机内通过printf将数据转换为文本打印出,根据文本数据的前缀,例如“A123”这样的格式,以“A”索引数据,去掉A,将数字部分由文本转换为数据类型。很难说二者谁更加优秀,如果是电脑与单片机间存在频繁的数据交换,那么匿名的方式更加的稳定高效,因为其数据协议在单片机中更容易解析。而只需要单片机单方面上传数据给电脑时UchartLv2是更简单,更高效,更加轻量的。
    所以本文章也主要讲述单片机大方面大量数据上传给电脑时,如何使用matlab对其进行解析。

    首先在单片机中,按照pritnf(“A%d\r\n”,x)这样的格式将你希望发送的数据通过串口发送到电脑,通过串口助手查看,并将文本保存至一个.txt文档中(有的串口助手能直接保存为文档,有的需要你在接收文本框中将其复制粘贴进.txt中)。而后代码如下

    // An highlighted block
    clear;
    clf;
    [init]=textread('Chaser_data.txt',' %s ',100000);%读取.txt文件,将文本转换为cell
    a=1;
    b=1;
    c=1;
    d=1;
    e=1;
    %将文本转化为double型
    for x=1:size(init)
        init_data=init{x,1};%从cell中提取出一个,该数据类型为char数组,对其进行解析
        if init_data(1,1)=='A'%查看首字母是否为需要的
            if ~isnan(str2double(init_data(1,2:length(init_data))))%对除首字母之外的char字符进行转换为double类型,若转化出NAN,即源数据有误,那么便舍弃。
                A_ADC(1,a)=str2double(init_data(1,2:length(init_data)));%若无误,则将其复制到某个你规定的矩阵中。
                a=a+1;
            end
        end
        if init_data(1,1)=='B'
            if ~isnan(str2double(init_data(1,2:length(init_data))))
                B_ADC(1,b)=str2double(init_data(1,2:length(init_data)));
                b=b+1;
            end
        end
        if init_data(1,1)=='C'
            if ~isnan(str2double(init_data(1,2:length(init_data))))
                C_ADC(1,c)=str2double(init_data(1,2:length(init_data)));
                c=c+1;
            end
        end
        if init_data(1,1)=='E'
            if ~isnan(str2double(init_data(1,2:length(init_data))))
                FMR_ADC(1,e)=str2double(init_data(1,2:length(init_data)));
                e=e+1;
            end
        end
    end
    

    以上列举了多个数据的共同解析,当然你也可以用诸如“ABCD”这样更长的字符串作为前缀,只是需要改一些地方即可

    for x=1:size(init)%讲文本转化为double型
        init_data=init{x,1};
        if length(init_data)>4%确定该char数组的长度超过你前缀的长度,否则在进行后续的计算时可能会报超出数组索引的错误
            if init_data(1,1:4)=="ABCD"
                if ~isnan(str2double(init_data(1,5:length(init_data))))
                    A(1,a)=str2double(init_data(1,5:length(init_data)));
                    a=a+1;
                end
            end
        end
     end
    

    以上便是一个简单的文本数据进行解析转换的简单示例,你可以用解析出的数据,做任何你想做的事。