当前位置: 首页 > news >正文

matlab多线程,parfor循环进度,matlab互斥锁

一. 内容简介

matlab多线程,parfor循环进度,matlab互斥锁

二. 软件环境

2.1 matlab 2022b

2.2代码链接

https://gitee.com/JJW_1601897441/csdn

三.主要流程

3.1 matlab多线程

有好几种,最简单的,最好理解的就是parfor,就拿那个为例子了,使用情况就是每一个for循环之前不能依赖关系,每轮计算都是独立的这种,才可以用parfor,不同版本不太一样,老版限制好像更多一些

parfor i = 1:1000disp(i);
end

在这里插入图片描述

3.2 parfor循环进度

用parfor并行去算一些东西的时候,有些需要循环很多次,我们是不清楚程序到底执行了多少轮,如果可以看到进度的话,时间太长了,我们或许就不会算了,

3.2.1 进度条窗口方式

会用就行,可以直接拷贝走,这个是官方文档里面找的

w = waitbar(0,'Please wait ...');% Create DataQueue and listener
D = parallel.pool.DataQueue;
afterEach(D,@parforWaitbar);N = 10000;
parforWaitbar(w,N)parfor i = 1:N% pause替换乘自己的就可以了pause(rand)send(D,[]);
end
delete(w);function parforWaitbar(waitbarHandle,iterations)persistent count h Nif nargin == 2% Initializecount = 0;h = waitbarHandle;N = iterations;else% Update the waitbar% Check whether the handle is a reference to a deleted objectif isvalid(h)count = count + 1;waitbar(count / N,h);endend
end

在这里插入图片描述

3.2.2 底部进度条方式

会用就行,也是官方网站里面找的,这个还需要一个文件,放到同一级目录就可以了,代码我放上边链接了

% 设置循环次数
N = 10000;
% 创建一个迭代计数器对象
parfor_progress(N);
parfor i = 1:N% pause替换乘自己的就可以了pause(rand)parfor_progress;
end
parfor_progress(0);

在这里插入图片描述

3.3 matlab互斥锁

在parfor循环中,读写数据是很麻烦的,并行计算就是要计算结果的,但是parfor中的计算结果很难接收出来,量少的时候,还可以通过数组接收(2016版不可以),量多的时候,数组接收就不太现实,每轮循环把数据写入文件中呢,parfor会报错,即使可以的话,由于matlab没有互斥锁,写文件即使可以写进去,也会是乱的,没办法用

还是那句话,会用就行,替换成自己的就可以了,注释写里面了

% 创建一个 DataQueue 对象
dq = parallel.pool.DataQueue;
file = fopen('ccc.txt','w');% 多重匿名函数
fun_with_params = @(data) saveData(data, file);
% 在 DataQueue 上设置 afterEach 方法,
% 这个是给数据绑定一个处理方法,就是在信号发送以后,执行那个处理方法,
% 这个处理方法不是并行的,同一时刻只有一个线程在处理数据,其他的线程都要排队
% 和互斥锁的思想很像
afterEach(dq, fun_with_params);
% 在工作线程中定义处理函数并发送数据到 DataQueue
parfor i = 1:100% 替换成自己的a = rand();% 在这里通过 send 函数将数据发送到 DataQueue% 可以发送单个,也可也发送数组send(dq, a);
endfclose(file);function saveData(data, file)% 在此处编写后处理代码fprintf(file,'%.10f ', data); fprintf(file,'\n'); 
end

在这里插入图片描述

3.4 parfor_progress.m

function percent = parfor_progress(N)
%PARFOR_PROGRESS Progress monitor (progress bar) that works with parfor.
%   PARFOR_PROGRESS works by creating a file called parfor_progress.txt in
%   your working directory, and then keeping track of the parfor loop's
%   progress within that file. This workaround is necessary because parfor
%   workers cannot communicate with one another so there is no simple way
%   to know which iterations have finished and which haven't.
%
%   PARFOR_PROGRESS(N) initializes the progress monitor for a set of N
%   upcoming calculations.
%
%   PARFOR_PROGRESS updates the progress inside your parfor loop and
%   displays an updated progress bar.
%
%   PARFOR_PROGRESS(0) deletes parfor_progress.txt and finalizes progress
%   bar.
%
%   To suppress output from any of these functions, just ask for a return
%   variable from the function calls, like PERCENT = PARFOR_PROGRESS which
%   returns the percentage of completion.
%
%   Example:
%
%      N = 100;
%      parfor_progress(N);
%      parfor i=1:N
%         pause(rand); % Replace with real code
%         parfor_progress;
%      end
%      parfor_progress(0);
%
%   See also PARFOR.% By Jeremy Scheff - jdscheff@gmail.com - http://www.jeremyscheff.com/error(nargchk(0, 1, nargin, 'struct'));if nargin < 1N = -1;
endpercent = 0;
w = 50; % Width of progress barif N > 0f = fopen('parfor_progress.txt', 'w');if f<0error('Do you have write permissions for %s?', pwd);endfprintf(f, '%d\n', N); % Save N at the top of progress.txtfclose(f);if nargout == 0disp(['  0%[>', repmat(' ', 1, w), ']']);end
elseif N == 0delete('parfor_progress.txt');percent = 100;if nargout == 0disp([repmat(char(8), 1, (w+9)), char(10), '100%[', repmat('=', 1, w+1), ']']);end
elseif ~exist('parfor_progress.txt', 'file')error('parfor_progress.txt not found. Run PARFOR_PROGRESS(N) before PARFOR_PROGRESS to initialize parfor_progress.txt.');endf = fopen('parfor_progress.txt', 'a');fprintf(f, '1\n');fclose(f);f = fopen('parfor_progress.txt', 'r');progress = fscanf(f, '%d');fclose(f);percent = (length(progress)-1)/progress(1)*100;if nargout == 0perc = sprintf('%3.0f%%', percent); % 4 characters wide, percentagedisp([repmat(char(8), 1, (w+9)), char(10), perc, '[', repmat('=', 1, round(percent*w/100)), '>', repmat(' ', 1, w - round(percent*w/100)), ']']);end
end

3.5 补充

按下面代码执行的,afterEach只能保证传完数据以后执行对应函数,并不代表一个循环里面的都一起执行的
在这里插入图片描述

% 创建一个 DataQueue 对象
dq1 = parallel.pool.DataQueue;
dq2 = parallel.pool.DataQueue;
file1 = fopen('ccc1.txt','w');
file2 = fopen('ccc2.txt','w');
% 多重匿名函数
fun_with_params1 = @(data) saveData(data, file1);
fun_with_params2 = @(data) saveData(data, file2);
% 在 DataQueue 上设置 afterEach 方法
afterEach(dq1, fun_with_params1);
afterEach(dq2, fun_with_params2);
% 在工作线程中定义处理函数并发送数据到 DataQueue
parfor i = 1:1000% 替换成自己的a = rand();% 在这里通过 send 函数将数据发送到 DataQueue% 可以发送单个,也可也发送数组send(dq1, a);send(dq2, a);
end% 等待所有数据接收完成% 显示接收到的数据
% 辅助函数用于保存接收到的数据到数组
function saveData(data, file)% 在此处编写后处理代码fprintf(file,'%.10f ', data); fprintf(file,'\n'); 
end

改进

% 创建一个 DataQueue 对象
dq1 = parallel.pool.DataQueue;
file1 = fopen('ccc11.txt','w');
file2 = fopen('ccc21.txt','w');
file3 = fopen('ccc31.txt','w');
% 多重匿名函数
fun_with_params1 = @(data1) saveData(data1, file1, file2,file3);
% 在 DataQueue 上设置 afterEach 方法
afterEach(dq1, fun_with_params1);
% 在工作线程中定义处理函数并发送数据到 DataQueue
parfor i = 1:100% 替换成自己的a = rand();data = {i,i,i}% 在这里通过 send 函数将数据发送到 DataQueue% 可以发送单个,也可也发送数组send(dq1, data);
end% 等待所有数据接收完成fclose(file1);
fclose(file2);
fclose(file3);
% 显示接收到的数据
% 辅助函数用于保存接收到的数据到数组
function saveData(data, file1,file2,file3)% 在此处编写后处理代码data1 = data{1};data2 = data{2};data3 = data{1};fprintf(file1,'%.10f ',  data1); fprintf(file1,'\n'); fprintf(file2,'%.10f ',  data2);fprintf(file2,'\n'); fprintf(file3,'%.10f ',  data3);fprintf(file3,'\n'); 
end

相关文章:

matlab多线程,parfor循环进度,matlab互斥锁

一. 内容简介 matlab多线程&#xff0c;parfor循环进度&#xff0c;matlab互斥锁 二. 软件环境 2.1 matlab 2022b 2.2代码链接 https://gitee.com/JJW_1601897441/csdn 三.主要流程 3.1 matlab多线程 有好几种&#xff0c;最简单的&#xff0c;最好理解的就是parfor&am…...

建木使用进阶-创建密钥管理

阿丹&#xff1a; 第一次我们进入建木&#xff0c;第一件事情就是配置我们相关的密钥。 解读&#xff1a; 在建木中我们可以进行创建密钥来对我们服务器等密码进行方便的管理。 注意&#xff1a; 登录的时候账号为&#xff1a;admin 密码为&#xff1a;123456 这是初始…...

多模态第2篇:MMGCN代码配置

一、Windows环境 1.创建并激活虚拟环境 #创建虚拟环境命名为mmgcn&#xff0c;指定python版本为3.8 conda create -n mmgcn python3.8 #激活虚拟环境 conda activate mmgcn2.安装pytorch #torch2.0.0 cu118 pip install torch2.0.0cu118 torchvision0.15.1cu118 torchaudio…...

DHCP部署与安全详解

文章目录 一、DHCP是什么&#xff1f;二、DHCP相关概念三、DHCP优点四、DHCP原理1. 客户机发送DHCP Discovery广播包&#xff08;发现谁是DHCP服务器&#xff09;2. 服务器响应DHCP Offer广播包3. 客户机发送DHCP Request广播包4. 服务器发送DHCP ACK广播包 五、DHCP续约六、部…...

华为数通HCIP-PIM原理与配置

组播网络概念 组播网络由组播源&#xff0c;组播组成员与组播路由器组成。 组播源的主要作用是发送组播数据。 组播组成员的主要作用是接收组播数据&#xff0c;因此需要通过IGMP让组播网络感知组成员位置与加组信息。 组播路由器的主要作用是将数据从组播源发送到组播组成员。…...

linux 权限

一个文件的权限 我们知道一个文件分为两个部分&#xff1a;1. 文件的内容。 2. 文件的属性 我们对一个文件的操作也就存在以下的一些属性&#xff1a; 这个文件可以被你看到--------- 可读–read—r这个文件可以被你修改----------可写–write–w这个文件可以被编译器编译并执…...

SQL基础使用

SQL的概述 SQL全称&#xff1a; Structured Query Language&#xff0c;结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 经过多年发…...

金蝶云星空任意文件读取漏洞复现(0day)

0x01 产品简介 金蝶云星空是一款云端企业资源管理&#xff08;ERP&#xff09;软件&#xff0c;为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织&#xff0c;多利润中心的大中型企业&#xff0c;以 “开放、标准、社交”三大特性为数字…...

linux中readelf命令详解

readelf 用于显示elf格式文件的信息 补充说明 readelf命令 用来显示一个或者多个elf格式的目标文件的信息&#xff0c;可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位&#xff0c;64位的elf格式文件&#xff0c;也支持包含elf…...

Python 教程之标准库概览

概要 Python 标准库非常庞大&#xff0c;所提供的组件涉及范围十分广泛&#xff0c;使用标准库我们可以让您轻松地完成各种任务。 以下是一些 Python3 标准库中的模块&#xff1a; 「os 模块」 os 模块提供了许多与操作系统交互的函数&#xff0c;例如创建、移动和删除文件和…...

MySQL~数据库的基本概念

一、数据库的基本概念 1、数据库的英文单词&#xff1a; DataBase 【 DB】 2、什么数据库&#xff1f; 用于存储和管理数据的仓库。 3、数据库的特点&#xff1a; 持久化存储数据的 数据库就是一个文件系统 方便存储和管理数据 使用统一的方式操作数据库 -- SQL 4、常…...

uniapp文件下载

使用uniapp提供给我们的uni.downloadFile、uni.saveFile和uni.openDocument三个API就可以了 也很简单&#xff0c;直接贴一下代码&#xff0c;安修修改一下即可 <template><view><image tap"pdfDownLoad" style"width: 35rpx;height: 35rpx;&…...

让GPT人工智能变身常用工具-下

...

el-table 表格头部合并

<el-table v-loading"listLoading" :key"tableKey" :data"list" stripe border fit highlight-current-rowstyle"width: 100%;" size"mini"><el-table-column label"第一行" align"center">…...

【机器学习】Linear Regression

Model Representation 1、问题描述2、表示说明3、数据绘图4、模型函数5、预测总结附录 1、问题描述 一套 1000 平方英尺 (sqft) 的房屋售价为300,000美元&#xff0c;一套 2000 平方英尺的房屋售价为500,000美元。这两点将构成我们的数据或训练集。面积单位为 1000 平方英尺&a…...

STM32 中断优先级管理(二)

NVIC中断管理相关函数主要在HAL库关键文件stm32f1xx_hal_cortex.c中定义。 中断优先级分组函数 void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);这个函数的作用是对中断的优先级进行分组&#xff0c;这个函数在系统中只需要被调用一次。 void HAL_NVIC_SetPrio…...

17-汽水瓶

题目 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水&#xff0c;允许向老板借空汽水瓶&#xff08;但是必须要归还&#xff09;。 小张手上有n个空汽水瓶&#xff0c;她想知道自己最多可以喝到多少瓶汽水。 数据范围&#xff1a;输入的正整数满足 1≤n≤100 注意&…...

Mindar.JS——实现AR图像追踪插入图片或视频

Mindar.JS使用方式 注意&#xff1a;此篇文章需要启动https才可调用相机权限 图像追踪示例 需要用到两个js库 <script src"./js/aframe.min.js"></script><script src"./js/mindar-image-aframe.prod.js"></script>下面看一下标签…...

JVM源码剖析之JIT工作流程

版本信息&#xff1a; jdk版本&#xff1a;jdk8u40思想至上 Hotspot中执行引擎分为解释器、JIT及时编译器&#xff0c;上篇文章描述到解释器过度到JIT的条件。JVM源码剖析之达到什么条件进行JIT优化 这篇文章大致讲述JIT的编译过程。在JDK中javac和JIT两部分跟编译原理挂钩&a…...

【投资笔记】(23/7/31)下半年消费复苏的机会来了?

本文为本人投资逻辑验证&#xff0c;不作为任何建议&#xff1b; 政策面 汽车&#xff1a;&#xff08;一&#xff09;优化汽车购买使用管理&#xff08;二&#xff09;扩大新能源汽车消费&#xff0c;重点在于新能源汽车&#xff1b;房地产&#xff1a;&#xff08;三&#x…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...