matlab for循环太慢,Matlab中每个for循环迭代的速度降低

我在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,(['

']))

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,(['

']));

%disp((['

']));

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([

]); pause(.05); end,它将保存一些分配并使其更具可读性。请注意,此更改之后,您也不再需要d。另外,我尝试重现此问题,但是在所有迭代中,我都看不到for循环的运行时间有任何变化(如我的建议)。

刚刚写了一个答案,但意识到可能还为时过早。由于您的循环中没有越来越多的向量,因此不应增加运行时间。无论如何,如果有帮助,您可以在发送字符串之前对其进行预处理,然后每个对cellstr的引用将为O(1)。

我无法在计算机上重现此问题。我尝试为其计时,但是部分随机峰值是正常的,时间似乎保持在0.05秒以上。但是,我要指出的是,您有很多常量,它们的含义相同或部分相同。这使得很难看到它们之间的关系。例如,很难看到tosd实际上独立于bpm。为避免掩盖此类行为,您需要清楚自己的意图。通过代码或注释。

在您的代码中未定义handles.UltraM。同样,您似乎打开了一个重复的问题。请注意,这对SO来说是一个很大的禁忌,最终并不能帮助您解决很多问题。

我没有列出串行端口的初始化信息,也没有给出参数,我不想包含一堆对试图解决@Alexander F的问题并不重要的代码。在重新制定这个问题之前,我打开了第二个问题,因为他们讨论了不同的主题,此后我将其删除

经过一番来回的思考,我想我知道您要达到的目标以及阻碍您前进的道路。

我已经对您的代码进行了编辑,以使其更快,更易读。大多数情况下,操作花费的时间略高于0.05秒,并且在几个时间点上,花费的时间可能比预期的时间长5毫秒。当然,您的年龄可能会有所不同。由于我没有arduino,所以我不知道那里是否有瓶颈。您还应该尝试使用内置的Matlab探查器对代码进行性能分析(这非常有用),以查看到底是什么导致代码变慢。

我发现减慢您的代码速度的主要因素是您使用了plot函数一次为图形添加了一个点。每次调用此函数时,它都会创建一个新的图形对象。经过几百次之后,事情变得迟钝了。相反,您应该只更新已经绘制的数据并使用drawnow重绘它。

简而言之,解决方案是这样的:

1)用单点初始化绘图并保存图形手柄以备后用:

p1 = plot(0,0,'b*');

2)然后,在循环内部,一旦您的数据数组已更新,就用新数组替换现有绘图中的数据。

set(p1, 'XData', 1:i, 'YData', y(1:i));

3)重新绘制图以反映最新的更新。

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)

问题是我需要一次发送一个值,所以索引1索引2等等,并且我需要以某个统一的间隔发送它们,我尝试修改您提供的代码,以便这样做,但性能仍然很慢比我尝试运行5分钟的时间长了大约1分钟

@ emg184,我对您"发送值"的含义感到非常困惑。另外,这些值是否需要即时生成,还是可以像我建议的那样对其进行预处理?在生成字符串之后,您仍然可以有一个循环来一次打印一个值。在不太热的笔记本电脑上,生成时间不到一秒钟。您是否尝试对代码进行性能分析,以查看运行时花费了最多时间?如果它是disp函数,则可以尝试使用fprintf代替,它应该会更快一些。最后,为什么您pause(0.5)?

@ emg184,如果您的目标是每0.05秒打印一个字符串,则使用pause将不准确。相反,您应该使用以下内容(假设您按照我的建议对字符串进行了预处理):for i=1:d, t = tic; fprintf(%s

, y4{i}), while toc(t) < 0.05, continue; end, end。对不起,单线,注释不允许缩进。如果这是您需要的内容,我会在答案中写出来。在这种情况下,您甚至不需要进行预处理。

谢谢您的回应。很抱歉等待您的回复,我离开了一段时间。我做了你所说的,它的性能更好,但是我想做的是用fprintf将值发送到arduino,同时用fscanf读取来自arduino的数据,然后实时绘制它,得到了打印值但是我可以读取部分值,但是我似乎无法将它们存储在数组中以备后用。我可以实时绘图,但是当我实时绘图时,它不允许我正确读取数据。

@ emg184,阅读输入是您在问题或示例代码中未提到的全新问题。也许您应该重新设计问题,以适合您要达到的目标以及在哪些约束下。

我现在将重新制定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Js表单验证整理

1.手机验证[验证13系列和150-159(154除外)、180、185、186、187、188、189几种号码&#xff0c;长度11位] function isMobel(value) { if (/^13\d{9}$/g.test(value) || (/^15[0-35-9]\d{8}$/g.test(value)) || (/^18[05-9]\d{8}$/g.test(value))) { return true; …

Ruby on Rails 實戰聖經阅读(三)

由于是1.8.x&#xff1b;圣经的1.9.3差太多,所以另外按1.8.X来创建hello world 第一個Hello World!! 1. 创建项目rails -d mysql first 2。创建控制器 cd first ruby script/generate controller hello 3.创建交互动作 vi app/controllers/hello_controller.rb 修改为 …

Java简单的返回结果工具类

以下是一个简单的Java工具类&#xff0c;用于返回结果&#xff1a; public class ResultUtil {/*** 返回成功结果* param data 返回的数据* param <T> 数据类型* return Result对象*/public static <T> Result<T> success(T data) {Result<T> result …

Sql自动配置器原理及其说明

简介&#xff1a;Sa设置辅助器设计的初衷是为了抛开繁琐与重复的配置&#xff0c;这种繁琐到了一定程度回使人厌烦&#xff0c;重复到了一种程度让人觉得无趣&#xff0c;为了解决这种厌烦与无趣&#xff0c;她就出现与产生了。底下的原理适用于任何SQL Server版本与运行平台。…

Oracle 日常巡检——数据库基本情况检查

对于线上的业务&#xff0c;Oracle 的 数据库 运行的稳定性和安全性是用户关心的一个至关重要的问题&#xff0c;除了通过监控平台对数据库进行监控以外&#xff0c;还需要定期对数据库进行“体检”&#xff0c;数据库巡检是保障数据库稳定运行的必不可少的辅助手段。 本文将简…

matlab对多个矩阵循环,MATLAB:在不使用循环的情况下提取矩阵的多个部分

有许多方法可以在没有循环的情况下完成此操作.大多数解决方案涉及将向量x和y扩展为更大的索引矩阵,并且可能使用函数REPMAT,BSXFUN或SUB2IND中的一个或多个.可以在here找到用于矩阵索引的良好教程.但是,既然你要求一个优雅的解决方案,这里有一点不寻常.它使用anonymous functio…

路由器ospf动态路由配置

技术原理&#xff1a;Ospd开放式最短路径优先协议。是目前网络中应用最广泛的路由协议之一。属于内部网络路由协议。能够适应各种规模的网络环境&#xff0c;是典型的链路状态协议。Ospf路由协议通过向全网扩散本设备的链路状态信息&#xff0c;使网络中每台设备最终同步一个具…

js常用事件整理—兼容所有浏览器

1.鼠标滚动事件。 说明&#xff1a;返回值 大于0向上滚动&#xff0c;小于0向下滚动。 兼容型&#xff1a;所有浏览器。 代码&#xff1a; /*********************** * 函数&#xff1a;鼠标滚动方向* 参数&#xff1a;event * 返回&#xff1a;滚轮方向[向上&#xff08;大…

Kubernetes 持久化存储 Cephfs

熟悉kubernetes volume的同学应该了解&#xff0c;kubernetes 对volume的提供支持“静态PV”和“动态PV”两种方式。 静态PV&#xff1a;集群管理员创建一些PV&#xff0c;之后便可用于PVC消费。 动态PV&#xff1a;相比静态PV而言&#xff0c;动态PV无需管理员手动创建PV&…

RDIFramework.NET — 系列目录 — 基于.NET的快速信息化系统开发框架

RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录RDIFramework.NET&#xff0c;基于.NET的快速信息化系统开发、整合框架&#xff0c;给用户和开发者最佳的.Net框架部署方案。框架简单介绍RDIFramework.NET&#xff0c;基于.NET的快速信息化系统开发、整合框…

Visual Studio项目版本转换器(c#项目版本转换器 v1.0)

Visual Studio项目版本转换器&#xff08;c#项目版本转换器 v1.0&#xff09; 使用截图&#xff1a; 下载地址&#xff1a;http://files.cnblogs.com/stone_w/VsConvert.zip vs转换中文通用版&#xff0c;目前版本只支持c#程序。 功能说明&#xff1a; 1.智能判断当前待转换引…

debian apache php mysql,Debian下配置APACHE2+MYSQL5+PHP5

Loading...如果之前安装过apache, mysql, php,要先删除掉&#xff1a;#apt-get remove --purge apache2.2-common apache2#apt-get remove mysql1. 先安装apache2#apt-get install apache2.2-common apache2#apache2ctl start //启动apache2测试&#xff0c;在我的host os中的I…

基于 Kubernetes 构建企业 Jenkins 持续集成平台

1、部署Jenkins 新建kube-ops 命名空间 $ kubectl create namespace kube-ops 新建Deployment文件(jenkins2.yaml) ---apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: jenkins2 namespace: kube-opsspec: template: metadata: labels: …

TC 配置插件

转载&#xff1a;http://hi.baidu.com/accplaystation/item/07534686f39dc329100ef310 1、插件下载地址&#xff1a;http://www.topcoder.com/tc?moduleStatic&d1applet&d2plugins 一般用下面三个插件&#xff1a;CodeProcessor&#xff08;2.0&#xff09;&#xff0…

WebClient 访问间歇性返回403解决方案

说明&#xff1a;前段时间做的一个项目莫名的返回403的错误&#xff0c;这种情况也多大是程序员最不喜欢的了&#xff0c;没办法先来分析一下错误信息。之前的代码如下&#xff1a; WebClient webclient new WebClient();string u9Str webclient.DownloadString("http:/…

bootstrap select2 php,JS组件Bootstrap Select2使用方法详解

在介绍select组件的时候&#xff0c;之前分享过一篇JS组件中bootstrap multiselect两大组件较量的文章&#xff0c;这两个组件的功能确实很强大&#xff0c;本文分享下select组件的一些用法和特性。一些通用的单选、多选、分组等功能这里就不多做介绍了&#xff0c;multiselect…

恢复Linux系统权限

注意 如果Linux整个系统文件权限都被设置为777&#xff0c;请不要重启系统&#xff0c;因为很多同学认为万能的重启能解决98%的问题。重启后权限就能恢复。但这次请不要重启系统&#xff0c;如果重启系统&#xff0c;系统直接损坏。 解决思路 虽然损坏的服务器没有权限备份&…

读《我们终将逝去的青春》

前一阵看了电影版的《致我们终将逝去的青春》&#xff0c;刚好手上有这本小说&#xff0c;于上我急功近利地花了大概2天把文字版的《致青春》看完了。总体感觉电影版对小说的后半部分做了大幅的修改&#xff0c;感觉修改得不太好。也许电影的主题是青春无悔的爱情&#xff0c;而…

文件删除小助手

亲&#xff0c;还在为删除多个文件而发愁吗&#xff1f;还在为删除不同目录下的N多文件而发愁吗&#xff1f;那你就下载这个吧。 功能以及优点&#xff1a; 1.支持删除某一类文件。 2.支持某一路径下所有文件的检索删除。 3.支持复杂文件名称匹配。 4.免安装&#xff0c;绿色中…

2020-11-29

分布式爬虫往往都需要多个环境&#xff0c;多个进程&#xff0c;如果手动去管理这些环境是很费事的&#xff0c;使用Docker集群就能很好地帮你解决这些问题&#xff0c;让你的爬虫管理变得简单。 主节点安装Docker 这里主节点建议大家使用Ubuntu&#xff0c;从节点随意。 Ubun…