matlab循环迭代6,matlab - Matlab中每个for循环迭代的速度降低 - 堆栈内存溢出
经过一番来回的思考,我想我知道您要达到的目标以及阻碍您前进的道路。
我已经对您的代码进行了编辑,以使其更快,更易读。 大多数情况下,操作花费的时间略高于0.05秒,并且在某些时间点,操作可能比预期的时间长约5毫秒。 当然,您的年龄可能会有所不同。 由于我没有arduino,所以我不知道那里是否有瓶颈。 您还应该尝试使用内置的Matlab探查器对代码进行性能分析(这非常有用),以查看到底是什么导致代码变慢。
我发现减慢代码运行速度的主要原因是您使用了plot函数每次向plot添加一个点。 每次调用此函数时,它都会创建一个新的图形对象。 经过几百次之后,事情变得迟钝了。 相反,您应该只更新已经绘制的数据,然后使用drawnow重新绘制它。
简而言之,解决方案是这样的:
1)用单点初始化绘图并保存图形手柄以备后用:
p1 = plot(0,0,'b*');
2)然后,在循环内部,一旦您的数据数组已更新,就用新数组替换现有绘图中的数据。
set(p1, 'XData', 1:i, 'YData', y(1:i));
3)重新绘制图以反映最新的更新。
drawnow;
drawnow最终还会减慢您的代码的速度,因为它必须在每次迭代时重新绘制越来越大的图。 为了使工作更快,您可能需要较长的时间间隔来刷新图。 例如,以下将每10次迭代刷新一次:
if rem(i,10) == 0
drawnow;
end
完整代码如下。 让我知道您是否还有其他问题。
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,(['
']))
disp(['
']); % replacing with disp (I don't have an arduino)
pause(5);
%y = []; % unnecessary here, preallocated before loop
figure(1);
p1 = plot(0,0,'b*'); % plotting one dot to create an object, data will be overwritten
hold on;
title('Pressure Data');
xlabel('Data Number');
ylabel('Analog Voltage (0-1023)');
%t1 = []; % unnecessary here, preallocated before loop
figure(2);
p2 = plot(0,0,'b*'); % plotting one dot to create an object, data will be overwritten
hold on;
title('Time to execute task');
xlabel('iteration number');
ylabel('time taken');
% preallocate t1 and y arrays for faster operation
t1 = zeros(size(x));
y = zeros(size(x));
i = 1; % moved closer to loop beginning for better readability
while i <= length(x) % parentheses unnecessary in Matlab
t2 = tic;
t = tic;
%fprintf(handles.UltraM,(['
']));
disp((['
'])); % replacing with disp (I don't have an arduino)
%y(i) = fscanf(handles.UltraM,'%d');
y(i) = randn; % replacing with random number (I don't have an arduino)
%figure(1); % unnecessary
%hold on; % unnecessary
%plot(i, y(i), 'b*');
% replacing the above with a slightly faster version
set(p1, 'XData', 1:i, 'YData', y(1:i));
%drawnow; % first one is annecessary
%hold off; % unnecessary
while toc(t) < 0.05
continue
end
t1(i) = toc(t2);
%figure(2); % unnecessary
%hold on; % unnecessary
%plot(i,t1(i),'b*');
% replacing the above with a slightly faster version
set(p2, 'XData', 1:i, 'YData', t1(1:i));
if rem(i,10) == 0 % refreshing every 10 iterations
drawnow;
end
%hold off; % unnecessary
i = i + 1;
end
先前版本的答案
您可以通过以下两个语句完全替换循环来向量化循环:
% vectorizing num-to-string conversion
y4 = cellstr(strcat('
'));
% deleting all spaces
y4 = cellfun(@(u) u(~isspace(u)), y4, 'UniformOutput', false)
这个小小的调整可以使您的程序在我的PC上运行x4速度更快。
显示/打印结果也可以使用cellfun迭代器完成: cellfun(@disp, y4)
matlab循环迭代6,matlab - Matlab中每个for循环迭代的速度降低 - 堆栈内存溢出相关推荐
- java中mypoiexception,java - 如何使用Poi获取Java中单元格的数据验证源? - 堆栈内存溢出...
此问题包含多个不同的问题. 首先,我们需要获取工作表的数据验证,然后为每个数据验证获取数据验证所适用的Excel单元格范围. 如果该单元格位于该单元格范围之一中,并且数据验证是列表约束,则进行进一步处 ...
- 如何为linux 桌面文件内存,linux - 桌面Linux发行版中.desktop文件的功能是什么? - 堆栈内存溢出...
我有以下情况:我必须修改一个.desktop文件,该文件位于我正在使用的应用程序的包中. 当我尝试打开文件的内容时,我遇到了一个奇怪的问题. 如果我点击它然后我尝试点击"打开"它给 ...
- java ecj_java - 在Maven构建中使用Eclipse Java Compiler(ecj) - 堆栈内存溢出
与标准Javac编译器相比,Eclipse Java编译器(ecj)具有很多优势. 它速度很快,并且可以配置更多警告和错误,从而提高了代码质量. 编译器中最有趣的事情之一是在编译器内部添加了null类 ...
- java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出
===============>>#1 票数:41 已采纳 使用slf4j无法做到这slf4j . 我想,缺少这个功能的原因是,几乎不可能为slf4j构建一个Level类型,它可以有效地映 ...
- android 边框重叠,android - Android:recyclerview中的viewitems轮廓与recyclerview边框重叠 - 堆栈内存溢出...
在我当前的项目中,我有一个RecyclerView ,其边框为圆角矩形. 我在布局xml中使用background view标签对其进行了设置,并产生了正确的效果: ... android:backg ...
- ie11 html元素操作,css - 在IE11中过滤html / body元素的灰度[重复] - 堆栈内存溢出
由于IE不支持滤镜:grayscale ,您可以尝试使用SVG + JS方法在IE中应用灰度滤镜. 以下是代码片段的一部分. // Grayscale images only on browsers ...
- java自动生成项目编号_java - Apache POI,在同一文档中创建项目符号点和编号列表 - 堆栈内存溢出...
我试图用apache poi创建一个既包含圆点又包含编号列表的文档. 我想得到这样的结果. 名单: 清单1项目0 清单1项目1 清单1项目2 列表后的段落. 清单2: 清单2项目0 清单2项目1 清单 ...
- android framelayout 高度,android - Android:如何将FrameLayout中的线性布局与底部对齐? - 堆栈内存溢出...
使用属性layout_gravity对齐FrameLayout中的任何视图 android:layout_gravity:"bottom" /> 但是,如果您尝试将其放置在其 ...
- mysql存储过程中as_mysql - 存储过程mySQL语法错误意外“ AS” - 堆栈内存溢出
我正在编写一个存储过程,如下所示 我得到的错误是在第3行和第4行,这两个错误是第3行是"意外的'发布者'标识符",第4行是"意外的AS(as)",但我不知道我是 ...
最新文章
- gdb+gdbserver
- Java迭代器Iterator
- requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?
- 161227、js显示对象所有属性和方法的函数
- CentOS7 安装Mysql5.6 后启动失败处理 The server quit without updating PID file
- Centos为什么比不过Ubuntu和Debian?
- 搜python题_python知识点汇总(可以搜Python题答案的APP)
- ORACLE忘记sys密码
- angelajs中ajax,Fabric.js Triangle angle属性用法及代码示例
- Android音频系统之AudioFlinger(一)
- AngularJs HelloWorld
- 乐高机器人编程自学入门
- 北京小升初混战:有家长给孩子报7个奥数班
- 工作经验分享:为什么我们要写Unti Test
- 危险废物处置与管理市场深度研究分析报告
- 【大数据】城市公交网络分析与可视化(二):获取公交行驶路径并绘制散点图
- VueDemo-12.加入购物车
- ADXL345 三轴加速度角度传感器
- java计算机毕业设计Web产品管理系统MyBatis+系统+LW文档+源码+调试部署
- 消除笔哪个p图软件有?快把这些软件收好