You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
7.6 KiB
220 lines
7.6 KiB
function ConvertToC(fileName) |
|
delimiter = ''; |
|
|
|
%% Format string for each line of text: |
|
% column1: text (%s) |
|
% For more information, see the TEXTSCAN documentation. |
|
formatSpec = '%s%[^\n\r]'; |
|
|
|
%% Open the text file. |
|
fileID = fopen(strcat(fileName,'.m'),'r'); |
|
|
|
%% Read columns of data according to format string. |
|
% This call is based on the structure of the file used to generate this |
|
% code. If an error occurs for a different file, try regenerating the code |
|
% from the Import Tool. |
|
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'ReturnOnError', false, 'Bufsize', 65535); |
|
|
|
%% Close the text file. |
|
fclose(fileID); |
|
|
|
%% Create output variable |
|
SymbolicOutput = [dataArray{1:end-1}]; |
|
|
|
%% Clear temporary variables |
|
clearvars filename delimiter formatSpec fileID dataArray ans; |
|
|
|
%% Convert indexing and replace brackets |
|
|
|
% replace 1-D indexes |
|
for arrayIndex = 1:99 |
|
strIndex = int2str(arrayIndex); |
|
strRep = sprintf('[%d]',(arrayIndex-1)); |
|
strPat = strcat('\(',strIndex,'\)'); |
|
for lineIndex = 1:length(SymbolicOutput) |
|
str = char(SymbolicOutput(lineIndex)); |
|
SymbolicOutput(lineIndex) = {regexprep(str, strPat, strRep)}; |
|
end |
|
end |
|
|
|
% replace 2-D left indexes |
|
for arrayIndex = 1:99 |
|
strIndex = int2str(arrayIndex); |
|
strRep = sprintf('[%d,',(arrayIndex-1)); |
|
strPat = strcat('\(',strIndex,'\,'); |
|
for lineIndex = 1:length(SymbolicOutput) |
|
str = char(SymbolicOutput(lineIndex)); |
|
SymbolicOutput(lineIndex) = {regexprep(str, strPat, strRep)}; |
|
end |
|
end |
|
|
|
% replace 2-D right indexes |
|
for arrayIndex = 1:99 |
|
strIndex = int2str(arrayIndex); |
|
strRep = sprintf(',%d]',(arrayIndex-1)); |
|
strPat = strcat('\,',strIndex,'\)'); |
|
for lineIndex = 1:length(SymbolicOutput) |
|
str = char(SymbolicOutput(lineIndex)); |
|
SymbolicOutput(lineIndex) = {regexprep(str, strPat, strRep)}; |
|
end |
|
end |
|
|
|
% replace commas |
|
for lineIndex = 1:length(SymbolicOutput) |
|
str = char(SymbolicOutput(lineIndex)); |
|
SymbolicOutput(lineIndex) = {regexprep(str, '\,', '][')}; |
|
end |
|
|
|
%% replace . operators |
|
for lineIndex = 1:length(SymbolicOutput) |
|
strIn = char(SymbolicOutput(lineIndex)); |
|
strIn = regexprep(strIn,'\.\*','\*'); |
|
strIn = regexprep(strIn,'\.\/','\/'); |
|
strIn = regexprep(strIn,'\.\^','\^'); |
|
SymbolicOutput(lineIndex) = cellstr(strIn); |
|
end |
|
|
|
%% Replace ^2 |
|
|
|
% replace where adjacent to ) parenthesis |
|
for lineIndex = 1:length(SymbolicOutput) |
|
idxsq = regexp(SymbolicOutput(lineIndex),'\)\^2'); |
|
if ~isempty(idxsq{1}) |
|
strIn = SymbolicOutput(lineIndex); |
|
idxlp = regexp(strIn,'\('); |
|
idxrp = regexp(strIn,'\)'); |
|
for pwrIndex = 1:length(idxsq{1}) |
|
counter = 1; |
|
index = idxsq{1}(pwrIndex); |
|
endIndex(pwrIndex) = index; |
|
while (counter > 0 && index > 0) |
|
index = index - 1; |
|
counter = counter + ~isempty(find(idxrp{1} == index, 1)); |
|
counter = counter - ~isempty(find(idxlp{1} == index, 1)); |
|
end |
|
startIndex(pwrIndex) = index; |
|
% strPat = strcat(strIn{1}(startIndex(pwrIndex):endIndex(pwrIndex)),'^2'); |
|
strRep = strcat('sq',strIn{1}(startIndex(pwrIndex):endIndex(pwrIndex))); |
|
% cellStrPat(pwrIndex) = cellstr(strPat); |
|
cellStrRep(pwrIndex) = cellstr(strRep); |
|
end |
|
for pwrIndex = 1:length(idxsq{1}) |
|
strRep = char(cellStrRep(pwrIndex)); |
|
strIn{1}(startIndex(pwrIndex):endIndex(pwrIndex)+2) = strRep; |
|
end |
|
SymbolicOutput(lineIndex) = strIn; |
|
end |
|
end |
|
|
|
% replace where adjacent to ] parenthesis |
|
for lineIndex = 1:length(SymbolicOutput) |
|
strIn = char(SymbolicOutput(lineIndex)); |
|
[match,idxsq1,idxsq2] = regexp(strIn,'\w*\[\w*\]\^2','match','start','end'); |
|
[idxsq3] = regexp(strIn,'\[\w*\]\^2','start'); |
|
if ~isempty(match) |
|
for pwrIndex = 1:length(match) |
|
strVar = strIn(idxsq1(pwrIndex):idxsq3(pwrIndex)-1); |
|
strIndex = strIn(idxsq3(pwrIndex)+1:idxsq2(pwrIndex)-3); |
|
strPat = strcat(strVar,'\[',strIndex,'\]\^2'); |
|
strRep = strcat('sq(',strVar,'[',strIndex,']',')'); |
|
strIn = regexprep(strIn,strPat,strRep); |
|
end |
|
SymbolicOutput(lineIndex) = cellstr(strIn); |
|
end |
|
end |
|
|
|
% replace where adjacent to alpanumeric characters |
|
for lineIndex = 1:length(SymbolicOutput) |
|
strIn = char(SymbolicOutput(lineIndex)); |
|
[match,idxsq1,idxsq2] = regexp(strIn,'\w*\^2','match','start','end'); |
|
[idxsq3] = regexp(strIn,'\^2','start'); |
|
if ~isempty(match) |
|
for pwrIndex = 1:length(match) |
|
strVar = strIn(idxsq1(pwrIndex)+2*(pwrIndex-1):idxsq2(pwrIndex)-2+2*(pwrIndex-1)); |
|
strPat = strcat(strVar,'\^2'); |
|
strRep = strcat('sq(',strVar,')'); |
|
strIn = regexprep(strIn,strPat,strRep); |
|
end |
|
SymbolicOutput(lineIndex) = cellstr(strIn); |
|
end |
|
end |
|
|
|
%% Replace ^(1/2) |
|
|
|
% replace where adjacent to ) parenthesis |
|
for lineIndex = 1:length(SymbolicOutput) |
|
idxsq = regexp(SymbolicOutput(lineIndex),'\)\^\(1\/2\)'); |
|
if ~isempty(idxsq{1}) |
|
strIn = SymbolicOutput(lineIndex); |
|
idxlp = regexp(strIn,'\('); |
|
idxrp = regexp(strIn,'\)'); |
|
for pwrIndex = 1:length(idxsq{1}) |
|
counter = 1; |
|
index = idxsq{1}(pwrIndex); |
|
endIndex(pwrIndex) = index; |
|
while (counter > 0 && index > 0) |
|
index = index - 1; |
|
counter = counter + ~isempty(find(idxrp{1} == index, 1)); |
|
counter = counter - ~isempty(find(idxlp{1} == index, 1)); |
|
end |
|
startIndex(pwrIndex) = index; |
|
% strPat = strcat(strIn{1}(startIndex(pwrIndex):endIndex(pwrIndex)),'^2'); |
|
strRep = strcat('(sqrt',strIn{1}(startIndex(pwrIndex):endIndex(pwrIndex)),')'); |
|
% cellStrPat(pwrIndex) = cellstr(strPat); |
|
cellStrRep(pwrIndex) = cellstr(strRep); |
|
end |
|
for pwrIndex = 1:length(idxsq{1}) |
|
strRep = char(cellStrRep(pwrIndex)); |
|
strIn{1}(startIndex(pwrIndex):endIndex(pwrIndex)+6) = strRep; |
|
end |
|
SymbolicOutput(lineIndex) = strIn; |
|
end |
|
end |
|
|
|
%% Replace Divisions |
|
% Compiler looks after this type of optimisation for us |
|
% for lineIndex = 1:length(SymbolicOutput) |
|
% strIn = char(SymbolicOutput(lineIndex)); |
|
% strIn = regexprep(strIn,'\/2','\*0\.5'); |
|
% strIn = regexprep(strIn,'\/4','\*0\.25'); |
|
% SymbolicOutput(lineIndex) = cellstr(strIn); |
|
% end |
|
|
|
%% Convert declarations |
|
for lineIndex = 1:length(SymbolicOutput) |
|
str = char(SymbolicOutput(lineIndex)); |
|
if ~isempty(regexp(str,'zeros', 'once')) |
|
index1 = regexp(str,' = zeros[','once')-1; |
|
index2 = regexp(str,' = zeros[','end','once')+1; |
|
index3 = regexp(str,'\]\[','once')-1; |
|
index4 = index3 + 3; |
|
index5 = max(regexp(str,'\]'))-1; |
|
str1 = {'float '}; |
|
str2 = str(1:index1); |
|
str3 = '['; |
|
str4 = str(index2:index3); |
|
str4 = num2str(str2num(str4)+1); |
|
str5 = ']['; |
|
str6 = str(index4:index5); |
|
str6 = num2str(str2num(str6)+1); |
|
str7 = '];'; |
|
SymbolicOutput(lineIndex) = strcat(str1,str2,str3,str4,str5,str6,str7); |
|
end |
|
end |
|
|
|
%% Change covariance matrix variable name to P |
|
for lineIndex = 1:length(SymbolicOutput) |
|
strIn = char(SymbolicOutput(lineIndex)); |
|
strIn = regexprep(strIn,'OP\[','P['); |
|
SymbolicOutput(lineIndex) = cellstr(strIn); |
|
end |
|
|
|
%% Write to file |
|
fileName = strcat(fileName,'.cpp'); |
|
fid = fopen(fileName,'wt'); |
|
for lineIndex = 1:length(SymbolicOutput) |
|
fprintf(fid,char(SymbolicOutput(lineIndex))); |
|
fprintf(fid,'\n'); |
|
end |
|
fclose(fid); |
|
clear all; |