Matlab 提高实时串行数据打印代码效率的提示

Matlab 提高实时串行数据打印代码效率的提示,matlab,plot,serial-port,real-time,matlab-figure,Matlab,Plot,Serial Port,Real Time,Matlab Figure,我正在寻找关于如何改进代码的建议,以便使其能够更高效地实时运行。我花了相当多的时间试图弄清楚如何将我的产品矢量化,减少循环,以及如何更好地实时绘制数据(使用Matlab R2019a) 我希望您能就这些问题提出建议 1) 代码矢量化 2) 正在尝试找出如何将hold与子批一起使用。目前,我在进入串行数据例程之前初始化子绘图和绘图。但是,我没有将每个数据点添加到绘图中,而是在每次迭代中使用set命令重复绘制从开始到当前点的所有扩展数据和YData,我认为这是浪费 3) 还有其他提高效率的建议吗 4

我正在寻找关于如何改进代码的建议,以便使其能够更高效地实时运行。我花了相当多的时间试图弄清楚如何将我的产品矢量化,减少循环,以及如何更好地实时绘制数据(使用Matlab R2019a)

我希望您能就这些问题提出建议

1) 代码矢量化

2) 正在尝试找出如何将hold与子批一起使用。目前,我在进入串行数据例程之前初始化子绘图和绘图。但是,我没有将每个数据点添加到绘图中,而是在每次迭代中使用set命令重复绘制从开始到当前点的所有扩展数据和YData,我认为这是浪费

3) 还有其他提高效率的建议吗

4)
f.stop
是一个创建按钮的函数,可以让我启动和停止例程。如果有更好的方法可以做到这一点,例如在关闭绘图时使用绘图句柄使例程停止,那么我们也会非常感激

代码背景

该代码从arduino控制的定制电路板串行读取和绘制多路电容数据。电路板正在轮询一个3x3电容单元阵列,其中每个单元有4个差分电容信号,总共36个信号。这被绘制成3x3子图,每个图中有4个信号。数据只是一个数字流,我使用29069和29070作为标记,让我知道电路板何时开始和结束轮询所有激励通道。 通过顺序查看所有12个激励通道信号并将其分为4组,进入下一个电容通道,总共重复该过程3次,读取数据流(案例说明)


我没有尝试运行您的代码,因为如果没有缺失的函数或arduino硬件,将很难运行。您应该查看文档,以提供一个最小的、可复制的示例:但是,我绝对可以提供一些建议:

首先,您是否尝试过使用Matlab profiler?在编辑器中,您可以使用“运行和时间”按钮。您也可以从命令提示符运行它,如下所示:

profile on; my_func_here; profile viewer
你更新情节的方式对我来说很有意义。这就是我应该做的:更新扩展数据/YData属性。不管你是重写整个向量还是更新一个位置,都不会有什么不同。作为另一种方法,您可以尝试每次调用plot来绘制一个新点;但我怀疑这会更慢。这是一件很容易的事情,你可以尝试不同的方法,分析每一种方法,看看哪一种是最有效的

关于停止阴谋,你的方法似乎很好。如果要在关闭绘图时使其停止,它可能会在没有任何附加代码的情况下停止,因为一旦图形和绘图消失,它将抛出错误。如果您想要一个更整洁的解决方案,您可以首先获得图形的句柄:

f = figure(1);
然后在while循环中,检查该图是否有效:

while isvalid(f)

当然,您仍然可能最终导致代码抛出错误,因为您可能会在isvalid检查和调用其中一个plot函数之间关闭图形。因此,为了避免这种情况,您可以在try/catch中包装调用以修改绘图

我没有尝试运行您的代码,因为如果没有缺失的函数或arduino硬件,将很难运行。您应该查看文档,以提供一个最小的、可复制的示例:但是,我绝对可以提供一些建议:

首先,您是否尝试过使用Matlab profiler?在编辑器中,您可以使用“运行和时间”按钮。您也可以从命令提示符运行它,如下所示:

profile on; my_func_here; profile viewer
你更新情节的方式对我来说很有意义。这就是我应该做的:更新扩展数据/YData属性。不管你是重写整个向量还是更新一个位置,都不会有什么不同。作为另一种方法,您可以尝试每次调用plot来绘制一个新点;但我怀疑这会更慢。这是一件很容易的事情,你可以尝试不同的方法,分析每一种方法,看看哪一种是最有效的

关于停止阴谋,你的方法似乎很好。如果要在关闭绘图时使其停止,它可能会在没有任何附加代码的情况下停止,因为一旦图形和绘图消失,它将抛出错误。如果您想要一个更整洁的解决方案,您可以首先获得图形的句柄:

f = figure(1);
然后在while循环中,检查该图是否有效:

while isvalid(f)

当然,您仍然可能最终导致代码抛出错误,因为您可能会在isvalid检查和调用其中一个plot函数之间关闭图形。因此,为了避免这种情况,您可以在try/catch中包装调用以修改绘图

您将数据数组预分配到1000个元素,但不能保证不会使用更多元素。因此,您可能需要扩展这些阵列,这需要花费时间

接下来,在这样的陈述中:

profile on; my_func_here; profile viewer
set(plotGraph1,'XData',c1_计时器(5,1:plot_count_1),{'YData'},num2单元格(c1(:,1:plot_count_1),2));
对于每个循环迭代,您通过索引复制数据,然后再次复制以转换为单元格数组。也就是说,
num2单元(c1(:,1:plot\u count\u 1),2)
导致迄今为止记录的所有数据的两个副本。这比附加到数组*要昂贵得多。我只需在
XData
YData
属性中添加数据,避免一直重复和复制数据:

c1=((传入数据1(3,1:4)./16777215)。*8.192)-4.096;
c1_定时器=四舍五入(toc(定时器_值));
% ...
对于ii=1:4
绘图1(ii).扩展数据(结束+1)=c1_定时器;
绘图仪1(ii).YData(end+1)=c1(ii);
结束
*请注意,在附加时,MATLAB会在必要时将数组的内部存储加倍,以便在一个数组中重复添加n个元素