【发布时间】:2016-07-28 15:20:22
【问题描述】:
我在 Matlab 中编写了一个 while 循环,它应该使用 Matlab 中的 tic toc 延迟以指定的时间间隔将数组中的每个值从 Matlab 发送到 arduino,然后读取值并将它们存储在变量中并绘制它们.
while 循环的输出会随着每次连续迭代而减慢。
我增加了缓冲区大小,这对它有很大帮助,但它仍然减慢了太多。是否有另一种方法可以提高按时打印值的速度。我已经包含了另一个 tic toc 和图表来显示这里的执行速度是代码:
max = 80;
min = 40;
amp = (max-min)/2;
offset = amp + min;
btime = 5;
bpm = 12;
spb = 60/bpm;
sapb = spb/.05;
tosd = sapb*bpm*btime;
time1 = btime*60;
x = linspace(0,time1,tosd)';
x1 = amp*sin(x*(2*pi/20)) + offset;
pause(1);
fprintf(handles.UltraM,(['<P' num2str(offset) '>']))
pause(5);
y = [];
i = 1;
figure(1);
hold on;
title('Pressure Data');
xlabel('Data Number');
ylabel('Analog Voltage (0-1023)');
t1 = [];
figure(2);
hold on;
title('Time to execute task');
xlabel('iteration number');
ylabel('time taken');
while (i<=length(x))
t2 = tic;
t = tic;
fprintf(handles.UltraM,(['<P' num2str(x1(i)) '>']));
%disp((['<P' num2str(x1(i)) '>']));
y(i) = fscanf(handles.UltraM,'%d');
figure(1);
hold on;
plot(i, y(i), 'b*');
drawnow;
hold off;
while toc(t) < 0.05
continue
end
t1(i) = toc(t2);
figure(2);
hold on;
plot(i,t1(i),'b*');
drawnow;
hold off;
i = i + 1;
end
【问题讨论】:
-
我不确定您看到了什么问题,但是您可以将
for循环缩短为:for i=1:length(x), disp(['<P' num2str(x1(i)) '>']); pause(.05); end,这样可以节省一些作业并使其更具可读性。请注意,在此更改之后,您也不再需要d。此外,我试图重现这一点,但在所有迭代中我看不到 for 循环的运行时间(如我的建议)的任何变化。 -
刚刚写了一个答案,但意识到它可能为时过早。由于您的循环中没有不断增长的向量,因此它不应该增加运行时间。无论如何,如果有帮助,您可以在发送字符串之前对其进行预处理,然后对
cellstr的每个引用将是O(1)。 -
我无法在我的机器上重现此问题。我试图给它计时,但一部分来自一些随机尖峰,这是预期的,因为时间似乎保持在 0.05 秒以上。但是,我想指出的是,您有很多常量的含义相同或部分相同。这使得很难看出它们之间的关系。例如,很难看出
tosd实际上独立于bpm。为避免掩盖此类行为,您需要清楚自己的意图。通过代码或通过 cmets。 -
handles.UltraM未在您的代码中定义。此外,您似乎打开了重复的question。只是提醒一下,这是对 SO 的一大禁忌,最终无助于解决您的问题。 -
我离开了串口的初始化和参数我不想包含一堆对我试图解决的问题并不重要的代码@Alexander F ...在我重新提出这个问题之前,我打开了第二个问题,因为他们讨论了不同的主题,我已经删除了它
标签: matlab for-loop serial-communication