主要内容

计算行数的代码通过使用报告信息对象

这个例子展示了如何计算的行数的源代码和报告生成的代码通过使用对象的信息。报告信息对象的更多信息,见通过编程方式访问代码生成报告信息

设置

添加示例文件路径。

路径= fullfile (matlabroot,“例子”,“编码器”,“主要”);目录路径);

MATLAB代码

在本例中,您为MATLAB函数生成代码迪杰斯特拉。这个函数计算的长度最短路径从一个节点到其他所有节点图使用迪杰斯特拉算法。

类型迪杰斯特拉
% DIJKSTRA算法找到图中的节点之间的最短路径长度% % D = DIJKSTRA算法(a, p) %图由其邻接矩阵a和节点%“p”作为输入,并返回一个向量' D '包含%最短路径的长度从“p”到所有其他节点图。% 2018年版权MathWorks公司函数D = dijkstra算法(A, p) % # codegen narginchk (2, 2);[m, n] =大小(一个);%的断言,以确保输入是有效的维护(m = = n,“输入邻接矩阵图必须是一个方阵”);断言(rem (p - 1) = = 0 & & p < = m & & p > 0,“输入src必须图中的一个节点”);%初始化max =最大浮点数;D = repmat (max, 1 m);D (p) = 0;访问= false(1米);因为我= 1:m %选择下一个节点访问最小=最大; u = -1; for v = 1:n if ~visited(v) && D(v) <= min min = D(v); u = v; end end % Mark selected node as visited visited(u) = true; %{ Update distances of nodes adjacent to selected node that are yet to be visited %} for v = 1:n if(~visited(v) && A(u, v) ~= 0 && D(u) ~= max) distVal = D(u) + A(u, v); if distVal < D(v) D(v) = distVal; end end end end end

指定邻接矩阵一个一个图表和一个节点p图的遍历的开始。画出图。调用迪杰斯特拉计算最短的距离p图中的每个节点和显示这些距离。

%样本与5节点邻接矩阵图一个= [0 1 1 0 0;1 0 0 1 1;1 0 0 1 0;0 1 1 0 1;0 1 0 1 0];%画出图来看看它的样子图G = (,“omitselfloops”);情节(G,“EdgeLabel”G.Edges.Weight)

%源节点在图遍历的开始p =兰迪(大小(A, 1));%计算最短的距离“p”中其他节点图GD = dijkstra算法(p);i = 1:元素个数(D)流(“最短路径的长度从% d % d % d。\ n”,p, i, D(我));结束
最短路径的长度从5比1是2。最短路径的长度从5到2是1。最短路径的长度从5到3是2。最短路径的长度从5 - 4 = 1。最短路径的长度从5到5是0。

出口信息代码生成

报告信息对象提供了编程访问代码生成的信息。这个对象的属性提供代码生成的信息设置,输入文件,生成的文件,和代码生成错误,警告和信息消息。

出口报告信息对象变量在你的基地MATLAB工作区,包括-reportinfo选择变量的名称而codegen命令运行。在本例中,您导出代码生成报告信息变量信息

codegen- c迪杰斯特拉arg游戏p {A}-reportinfo信息

计算代码的行数

疯狂的函数对象作为输入,并返回一份报告信息两个输出包含在源代码的行数和生成的代码,分别。这个函数不包括空白行和行包含注释而计算代码的行数。

类型疯狂的
% LOC计算总线源和生成的代码在一个codegen运行% % (i, o) = LOC (r) %报告信息对象“r”作为输入,并生成两个%输出——“我”和“o”包含总行代码分别源% MATLAB文件和生成的文件。% 2018年版权MathWorks公司函数[i, o] = loc (r) narginchk (1,1);%断言输入报告信息对象。断言(isa (r, coder.ReportInfo),输入必须coder.ReportInfo型);%从报告信息获取来源和生成的文件对象。源文件= r.InputFiles;generatedFiles = r.GeneratedFiles;%数行代码的来源和生成的文件。空行,%的言论是不计算在内。i = countLines(源文件,真正的); o = countLines(generatedFiles, false); end function count = countLines(files, isSource) count = 0; for i=1:numel(files) f = files(i); if isprop(f, 'Text') lines = splitlines(f.Text); for j=1:numel(lines) line = strtrim(lines{j}); if ~isempty(line) && ~isComment(line, isSource) count = count + 1; end end clear isComment; % clear persistent variables end end end function result = isComment(line, isSource) persistent inBlockComment; if isempty(inBlockComment) inBlockComment = false; end if isSource result = (startsWith(line, "%") || inBlockComment); if line == "%{" || line == "%}" inBlockComment = (line ~= "%}"); end else result = (startsWith(line, "/") || inBlockComment); if startsWith(line, "/*") || endsWith(line, "*/") inBlockComment = ~endsWith(line, "*/"); end end end

调用疯狂的报告信息对象信息作为输入。显示的行数的代码源文件和生成的文件。

信息= evalin (“基地”,“信息”);[nLocIn, nLocOut] = loc(信息);流(行代码的MATLAB源文件(s): % d ',nLocIn);
在MATLAB源文件的代码行(s): 29
流(“行代码生成的文件(s): % d ',nLocOut);
行代码中生成的文件(s): 500

清理

删除示例文件路径。

rmpath(路径);

另请参阅

相关的话题