级别:★
经常看到一些Matlab初学者写出带有层层循环的代码,这些代码往往运行得很慢,而且非常难懂。Matlab提供了大量的命令来避免循环
建议是:在确定要写一个针对矩阵操作的2重循环之前,请仔细阅读帮助中的Maximizing MATLAB Performance一节。
里面有很多例子,这里举一个我自己碰到的问题:
要统计数字图像的亮度最大值和最小值,由于数字图像可能是一个二维或三维的矩阵,开始我写出了如下的代码:
switch ndims(img)
case 2
m = max(max(img));
case 3
m = max(max(max(img)));
end
后来对这种做法很不满意,如果有一个8维的矩阵,难道我要写
max(max(max(max(max(max(max(max(x))))))))
才行?后来发现无论矩阵是什么维数,实际上
max( x(:) )
就够了。
点评:y = x(:) 这种方式可以返回矩阵的所有元素,形成一个列向量 y,无视 x 的维数。注:y 对 x 以列优先的方式排列
级别:★★★
问题:提取一幅RGB图象中的蓝色部分
解答:
[Copy to clipboard] [ - ]
CODE:
A=imread('input.bmp');
H = size(A);
BB=repmat(255, H(1)*H(2), H(3));
C=(A(:,:,1)==0 & A(:,:,2)==0 & A(:,:,3)==255);
BB(C,1) = 0;
BB(C,2) = 0;
B = reshape(BB, H(1), H(2), H(3));
imwrite(B,'output.bmp');
点评:注意 repmat 和 reshape 的用法。解答的关键是对 reshape 命令的灵活使用,把三维矩阵转换为二维矩阵,从而使得求出满足条件的下标矩阵 C 可以对原矩阵 A 进行引用。否则,这类问题一定摆脱不了循环语句。
级别:★
问题:赋值的技巧——当矩阵很多元素是相同时(下面以0为例,且不考虑稀疏矩阵的存储方式),“先生成全零阵,后再对特殊元素赋值”的方式将有利于缩短运行的时间。
例如:
把矩阵 A 作 0 扩展(变身:1个变4个,原来真身维持不变,其他假身为0),l例如:
A =
1 2 3 4
-1 -2 -3 -4
0 4 2 9
希望得到:
B=
1 2 3 4 0 0 0 0
-1 -2 -3 -4 0 0 0 0
0 4 2 9 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
解答:
[Copy to clipboard] [ - ]
CODE:
B = repmat(zeros(size(A)), 2, 2);
B(1:size(A,1), 1:size(A,2)) = A;
不推荐的做法:
[Copy to clipboard] [ - ]
CODE:
[row, col] = size(A);
for i = 1:2*row
for j = 1:2*col
if i >=1 && i <= row && j >= 1 && j <= col
B(i, j) = A(i, j);
else
B(i, j) = 0;
end
end
点评:也许是受制于 C 语言的影响,初学者往往把 matlab 当作 C 语言来使用,加上 matlab 宣称变量不需要定义即可以直接使用,因此导致大量的循环+单变量判断语句。掌握“:”运算符是向 matlab 矢量化编码进军的必经之路。
级别:★★
问题:有个80*80的矩阵,如何去掉全为0的行或者列
解答:
[Copy to clipboard] [ - ]
CODE:
a =
0 0 0 -3 0
1 0 0 0 0
0 2 0 0 0
0 0 0 0 0
0 0 0 0 0
>> a(:,~sum(abs(a),1))=[]
a =
0 0 -3
1 0 0
0 2 0
0 0 0
0 0 0
>> a(~sum(abs(a),2),:)=[]
a =
0 0 -3
1 0 0
0 2 0
点评:又是一个摆脱循环思想的典型例子。除了“: ”运算符的妙用之外,逻辑法对矩阵的下标索引也相当重要。此外,线性代数的知识也在这里得到体现:|a|+|b|+|c|=0 当且仅当 a = b = c = 0
级别:★★★★★
问题:对一幅灰度图像求它的二维联合分布密度——假设不使用 matlab 自带的函数直接求出来(如果有的话)
问题详细描述:
QUOTE:
设 (i,j), (k,l) 两个任意象素点上的灰度值分别为 g(i,j) 和 g(k,l),其值分别假设为 a, b,则图像灰度值的联合分布密度表示为
P(a,b)=Pk{g(i,j)=a, g(k,l)=b},其中 a, b 均为 0 到 L-1 之间的灰度整量电平。
由于灰度图象是 unint8 型,那它的灰度级就是 256 个灰度级。根据上面关于二维联合分布密度的定义,即是要求得到这幅图中同时满足某个给定条件的点的数量,这个条件是两个位置上像素的灰度值与当前统计的灰度配对是一致的。整个二维联合分布密度矩阵与协方差矩阵类似。
常规解答:
[m,n]=size(a);
a1=0
for ii=1:256
for jj=1:256
I0(ii,jj)=0;
for i=1:m
for j=1:n
for k=1:m
for l=1:n
if (a(i,j)==(ii-1))&(a(k,l)==(jj-1))
I0(ii,jj)=I0(ii,jj)+1;
a1=a1+1;
end
end
end
end
end
end
end;
简短说明:程序中的 ii, jj 即是相关的 a, b 值,它可以为 0 到 255 之间的任意数(也可以理解为用 ii 作为横坐标, jj 作为纵坐标)。设置了 a, b 的值后,就用个 FOR 循环来寻找图象中任两个位置上能够同时满足像素值为 a 和像素值为 b 的点(即为 IF 语句后的条件),当满足条件时,那么在该点上加一,就能统计出同时满足 a, b 的点的数量。因为 a, b 可以取不同的值,那么就能得出一个 256*256 大小的矩阵,也就是想要的二维联合分布密度。
优化解答:
A = [1,2,3;2,3,6;6,4,5;1,1,3];
B = unique(A);
C = hist(double(A(:)), double(length(B)));
D = C'*C;
E = -diag(diag(D))+D;
E = diag(C) + E;
A
E
点评:这是 matlab 编程思想转变的一个典型例子,即从算法上去改进程序,使之减少循环。常规解法使用了6个循环,而优化解法则没有使用循环。转化的思想是:考虑到问题本身的特点,即:灰度配对的点的个数(简称点数) = 各灰度点数之积,因此首先求出矩阵 A 中互异的元素 B,然后,利用 hist 函数统计每个互异元素出现的次数 C,即各灰度点数。在此基础上,C 的转置与 C 的乘积矩阵 D 就是两互异灰度的点数。剩下的问题是把 D 的主对角线换掉(因为相乘时统计多了),这通过先置零,后添加来进行。
级别:★
问题:求出满足特定条件的元素,并按行统计个数
解答:
不推荐的做法:
[Copy to clipboard] [ - ]
CODE:
[m,n]=size(t2);
for j=1:n
for i=1:m
if (t2(i,j)-y2(i,j))/t2(i,j)<0.2
hege(j)=hege(j)+1;
end
end
end
推荐的做法:
[Copy to clipboard] [ - ]
CODE:
A = ((t2-y2)./t2) < 0.2;
hege = sum(A,1);
点评:充分发挥 matlab 基于矩阵的思想,从整体出发考虑问题,避免了使用基于 C 语言 的循环语句。
级别:★★★★★
问题:游程平滑算法:将连续的且个数小于某个阈值的0全部替换成1,例如:
平滑前:1111100000111100011
平滑后:1111100000111111111
解答:
常规解法:
[Copy to clipboard] [ - ]
CODE:
clear all
I=[0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1];
T = 4;
Idiff = diff(I);
index1 = find(Idiff == -1);
index2 = find(Idiff == 1);
if length(index1) == 0 | length(index2) == 0,
%%%全1或者全0的情况,根据自己需要单独处理一下
coutinue;
else
if length(index1) == length(index2)+1,
tt = index2 - index1(1:end-1);
tt = [tt,length(I)-index1(end)];
index3 = find(tt <= T);
for ii = 1:length(index3);
I(index1(index3(ii))+1:index1(index3(ii))+tt(index3(ii))) = 1;
end
elseif length(index1) == length(index2)-1,
if index2(1) <= T;
I(1:index2(1)) = 1;
end
tt = [index2(2:end) - index1];
index3 = find(tt <= T);
for ii = 1:length(index3);
I(index1(index3(ii))+1:index1(index3(ii))+tt(index3(ii))) = 1;
end
elseif length(index1) == length(index2),
if index1(1)>index2(1),
if index2(1) <= T;
I(1:index2(1)) = 1;
end
tt = index2(2:end) - index1(1:end-1);
index3 = find(tt <= T);
for ii = 1:length(index3);
I(index1(index3(ii))+1:index1(index3(ii))+tt(index3(ii))) = 1;
end
if length(I)-index1(end) <=T,
I(index1(end):end) = 1;
end
elseif index1(1) < index2(1),
tt = index2 - index1;
index3 = find(tt <= T);
for ii = 1:length(index3);
I(index1(index3(ii))+1:index1(index3(ii))+tt(index3(ii))) = 1;
end
end
end
end
I
优化解法:
[Copy to clipboard] [ - ]
CODE:
a = [1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1];
T = 4;
b = sprintf('%d',a);
[c,d]=regexp(b,'0+'); %%%
ind = find(d - c < T);
for ii = 1:length(ind),
a(c(ind(ii)):d(ind(ii))) = 1;
end
a
点评:优化解法巧妙地运用了正则表达式这个工具来处理特定字符串的搜索、匹配问题,因此比较快捷、简便。正则表达式的应用非常广泛,它是一种可以用于模式匹配和替换的强有力的工具。其作用如下:
1) 测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证;
2) 替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
备注:能否使用 regexpreg 命令一次性地进行搜索并完成替代呢?这样也许可以摆脱最后的循环语句。可惜本人功力有限,暂时未能实现。
分享到:
相关推荐
【清华大学】DeepSeek从入门到精通(视频课程+PDF)
自2019年以来,教育部启动实施“双高计划”,遴选确定首批“双高计划”建设单位197所,其中高水平学校建设单位56所,高水平专业群建设单位141所,河南省有黄河水利职业技术学院、河南工业职业技术学院等6所职业学校入选。2022年,教育部开展国家“双高计划”中期绩效评价,从评价结果看,国家“双高计划”任务进展顺利,建设成效突出,形成了一批先进经验做法和典型案例,在引领职业教育改革、服务国家战略和支撑区域发展方面形成示范势头。 今天,我们给大家分享一些“双高计划”专业群完整申报书与建设方案和中期评估报告。 ## 一、专业群完整申报书与建设方案 ## 二、“双高计划”中期报告 (100多份)
内容概要:本文详细探讨了电商平台上秒杀系统中减库存的设计逻辑和技术优化方法。首先,文中阐述了‘下单减库存’、‘付款减库存’和‘预扣库存’三种常见方式及其各自面临的问题和局限性,尤其是面对高并发流量冲击下的系统稳定性与数据准确性保障挑战。接着讨论了适用于大规模促销活动中快速而精准地扣除存货的方法,提出了诸如应用本地缓存(Local Cache)、引入高性能持久化键值存储(如Redis),甚至修改数据库引擎源代码(InnoDB 层面排队机制)等一系列先进解决方案来确保交易流程顺畅。此外,还提到了在极端情况发生(例如超卖)时如何借助补救措施挽回损失的具体实例。 适合人群:电商平台开发运维技术人员;有兴趣深入了解电商业务架构和技术优化的开发者和IT管理人员。 使用场景及目标:①帮助设计师理解不同减库存策略的应用时机及其利弊;②指导程序员针对特定业务需求选择最适合的技术路径进行项目构建;③提供给运维专家关于改善在线交易平台响应速度和服务质量的专业见解。 其他说明:本篇文章对于构建高效的电子商贸系统有着极高的参考价值,尤其是那些准备应对瞬息万变市场环境下的企业来说尤为重要。它不仅限于理论探讨层面,
动态表单,VUE动态表单。基于vue+elementplus实现动态表单组件,通过拖拽组件到面板即可实现一个表单。支持各个组件的动态隐藏显示,动态表格弹窗式维护。
【毕业设计】java-springboot-vue家居日用小百货交易网站实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot+vue火锅店管理系统源码(完整前后端+mysql+说明文档+LunW).zip
随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微服务在线教育系统的开发全过程。通过分析微服务在线教育系统管理的不足,创建了一个计算机管理微服务在线教育系统的方案。文章介绍了微服务在线教育系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本微服务在线教育系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,课程信息管理,课程类型管理,学科管理,购买的课程管理,职业规划管理,视频点播管理,我的笔记管理,我的课程管理,消息通知管理,学习交流,试卷管理,留言板管理,试题管理,系统管理,考试管理。用户功能有个人中心,用户管理,购买的课程管理,我的笔记管理,我的课程管理,消息通知管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得微服务在线教育系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高微服务在线教育系统管理效率。 关键词:微服务在线教育系统;SSM框架;MYSQL数据库;Spring Boot
javascript 基于Javascript实现,强化学习QLearning的一个贪吃蛇实例.
python教程学习
我国科学技术的不断发展,计算机的应用日渐成熟,其强大的功能给人们留下深刻的印象,它已经应用到了人类社会的各个层次的领域,发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分,使用计算机进行管理,具有非常明显的优点,利用网络的优势特开发了本基于Spring Boot的IT技术交流和分享平台。 本IT技术交流和分享平台是基于Spring Boot框架,采用Java技术,MYSQL数据库进行开发的。系统具有灵活的一体化设计方式,圆满完成了整个系统的界面设计。本系统实现了用户功能模块和管理员功能模块两大部分,通过该系统用户可以快速进行IT技术交流和分享,管理员可登录系统后台对系统进行全面管理,确保系统正常稳定的运行。系统功能齐全,符合用户IT技术交流和分享的需求。 本文主要首先介绍了课题背景、设计原则和研究内容,系统采用的相关技术及开发平台,接着对本基于Spring Boot的IT技术交流和分享平台进行系统需求分析和设计,包括系统的功能模块,数据库的设计,系统结构以及系统界面设计等,最后对进行系统测试,完成本篇论文。 关键词:IT技术交流, Spring Boot框架, Java技术,MYSQL数据库
疲劳检测yawn图片数据集
JDK7通过java-jwt验证
【毕业设计】java-springboot+vue会议管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
python学习资源
51CTO 1、技术解析篇-DeepSeek入门宝典 2、开发实战篇-DeepSeek入门宝典 3、行业应用篇-DeepSeek入门宝典 4、个人使用篇-DeepSeek入门宝典
内容概要:本文档是由高正奇编辑的针对模式识别和机器学习(PRML)教科书的一份详细的解答手册。文档覆盖了从基本概念如误差函数求导、贝叶斯定理应用到多元高斯分布计算、Gamma函数积分及其性质等一系列复杂问题的解决方案,以及涉及线性模型分类的基础练习题、条件概率和联合概率计算等入门级习题。每一题都经过细致推导,帮助学生加深对机器学习相关概念的理解并掌握具体的数学方法。 适合人群:主要适用于正在攻读机器学习、模式识别相关课程的学生,以及从事数据科学工作的专业人士作为深入理解和实践指南。 使用场景及目标:本手册旨在辅助教学过程中遇到的具体难题解析,在研究和实践中作为参考资料进行理论验证和技术难点突破,尤其有助于准备考试或者项目实施时需要巩固知识的应用场合。 其他说明:书中题目涵盖广泛,既有直观的概率论应用,也有复杂的积分变换技巧和最优化思路展示,对于希望提高自身计算能力和解决实际问题能力的学习者非常有价值。但要注意的是,部分内容较为深奥,可能不适合初学者自学使用,最好配合课堂讲解或其他教材一起学习效果更佳。
python学习资源
RFID-MATLAB的高等数学-CH06.rar
spaceX 动力学分析
如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让美容院信息的管理模式进行升级,也为了更好的维护美容院信息,美容院管理系统的开发运用就显得很有必要。并且通过开发美容院管理系统,不仅可以让所学的SpringBoot框架得到实际运用,也可以掌握MySQL的使用方法,对自身编程能力也有一个检验和提升的过程。尤其是通过实践,可以对系统的开发流程加深印象,无论是前期的分析与设计,还是后期的编码测试等环节,都可以有一个深刻的了解。 美容院管理系统根据调研,确定其实现的功能主要包括美容用品管理,美容项目管理,美容部位管理,销量信息管理,订单管理,美容项目预约信息管理等功能。 借助于美容院管理系统这样的工具,让信息系统化,流程化,规范化是最终的发展结果,让其遵循实际操作流程的情况下,对美容院信息实施规范化处理,让美容院信息通过电子的方式进行保存,无论是管理人员检索美容院信息,维护美容院信息都可以便利化操作,真正缩短信息处理时间,节省人力和信息管理的成本。 关键字:美容院管理系统,SpringBoot框架,MySQL