matlab中sort_Matlab排序的使用及其在弱光图像上的妙用

news/2024/11/9 23:57:49

​ 大家都知道,程序中运用大量的循环往往会导致运行速度降低,为了加快程序运算速度,往往是采用并行运算的方法,本质是是属于使用空间(内存)换取时间。而有些时候,使用排序也可以加快运行速度。碰巧前不久我改进了一个之前的程序,想法还挺巧妙,分享给大家。

Matlab排序函数sort

​ 这里不会详细介绍排序算法,直接使用Maltab自带的排序算法sort(),该算法使用的是快速排序的算法,排序速度非常快。使用方法如下:

[b, index] = a

​ 其中a为排序前向量,b为排序后向量,默认是升序排序,可以通过关键字"descend"获得降序排列结果。index表示的是位置,a(index)=b。这个index可以起到类似指针的作用,之后的操作主要就体现在它上面。

1658996bd9f8a959c30fa20eab75e45c.png

通过index可以建立排序前的向量a到排序后的向量b的映射,那么反过来怎么实现呢?很简单,只需要对index再进行一次排序,得到index2,b(index2)=a。

8ade48adddd6ac3bda9e1b474c8bc086.png

弱光图像

​ 在光学的模拟中有时候需要模拟探测器(CCD)在弱光情况下所接受到的图像。针对这么一个问题,由于CCD可以认为是接收了一定数量的光子, 这些光子分散在CCD的各个像素点上。光子撒下的位置的概率分布就是光强分布。也就是说,一个光子落在第一个像素的概率为这个像素的能量除以总能量。一个光子的位置就是以光强分布为概率分布产生的一个随机数。

​ 简单想一下这个问题,第一反正肯定是使用for循环,一个光子一个光子地撒,每个光子找到其位置,但是这样的方法实在太慢了。下面介绍两种方法。

方法1

​ matlab刚好有以一定概率分布产生随机数的函数,randsrc(),用法如下:

randsrc(m,n,[vi;p])

m,n为生成的随机数的维度,v和p分别为能够取到的数值和其对应的概率。在弱光图像的例子中,能够取到的数值表示的是CCD探测器的像素位置,按照这个概率分布可以生成大量的随机数,从物理上表示的是这些光子洒在探测器上的像素位置。

​ 代码如下:

N = length(I(:));
P = I/sum(I(:));
b = randsrc(photonNum, 1, [1:N;P(:).']);
Iphoton = hist(b, N);
Iphoton = reshape(Iphoton, size(I));

非常简单的代码,其中I表示原始图像,P表示的是概率分布。photonNum表示的是洒下的光子的个数,Iphoton表示弱光图像。

方法2

​ 方法1相比较而言是很容易理解的,而且由于并没有用到for循环,实际上运算速度也是非常快的。但是仍然有改进的空间,接下来介绍另一种方法,利用的就是排序的方法。先介绍代码:

[sortP,sortPosition] = sort(P);
photons = rand(photonNum,1);
FP = cumsum(sortP);
[~,ppositionP] = sort(sortPosition); % 这个用来实现变排序前的数组
[~, positionAll] = sort([photons;FP]);
[~,ppositionAll] = sort(positionAll);
II = diff([0;ppositionAll(photonNum+1: photonNum+length(FP))]) - 1; % 找到每个元素的个数
Iphoton = reshape(II(ppositionP), size(I));

​ 排序之后可以找到通过cumsum()函数得到分布函数,这样就可以随机生成0~1之间的数,根据分布函数,找到其对应的位置。找到位置的方法是将随机数与分布函数混合在一起进行排序,排序之后,原本连续排列的分布函数就被塞进了一些值。比如原来分布函数值为F1在第1个位置,F2在第2个位置,撒光子之后,F1还在第一个位置,F2移动到了第5个位置,说明F2对应的CCD上的像素接收到了3个光子。

稍微比较一下这两个方法,对于256X256大小的Lena图,撒1000000个光子运行时间分别为:

f14afa0153f27e9930b5446a0c5cf673.png
运行时间比较

方法1使用了63秒,方法2仅仅使用了0.6秒,可以明显看出两个方法速度上的差异。

结果显示

最后给出matlab的模拟结果

1cc4859ba54712648b55d535f28ae060.png
matlab模拟结果

http://www.niftyadmin.cn/n/3752796.html

相关文章

mysql数据库自定义函数格式_MySQL数据库创建自定义函数模板分享

摘要:下文讲述MySQL数据库中创建自定义函数的方法分享,如下所示:下文通过举例的方式讲述MySQL创建自定义函数的方法---例1:定义一个无参数的自定义函数 fn_maomaodrop function if exists fn_maomao; ---如果函数存在,则删除此自定…

以OpenGL/ES视角介绍gfx-hal(Vulkan) Shader/Program接口使用

文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录) 背景: The right way to tackle this in Vulkan is to use resource descriptors. A descriptor is a way for shaders to freely access resources like buffer…

mysql analyze_mysql的analyze,check,checksum,optimize,explain

ANALYZE TABLE用来分析和存储表的关键字的分布,使得系统获得准确的统计信息,影响 SQL 的执行计划的生成。对于数据基本没有发生变化的表,是不需要经常进行表分析的。但是如果表的数据量变化很明显,用户感觉实际的执行计划和预期的…

go 链接mysql当地时间_Golang, MySQL连接不设置时区的问题

Golang, MySQL连接不设置时区的问题发布时间:2020-06-25 08:11:08来源:51CTO阅读:1319作者:EDELWEISS_21gpackage mainimport ("fmt""github.com/go-xorm/xorm"_ "github.com/jinzhu/gorm/dialects/mysq…

无向图最短路径问题

题目&#xff1a;无向图G有N个结点(1<N<1000)及一些边&#xff0c;每一条边上带有正的权重值。 找到结点1到结点N的最短路径&#xff0c;或者输出不存在这样的路径。 解决思路&#xff1a;动态规划 1、首先使用邻接矩阵存储无向图 2、将找到结点1到节点N的最短路径分解成…

java mysql dump_Java 调用Mysql dump 备份数据库详解

SimpleDateFormat sdf new SimpleDateFormat("yyyyMMddHHmmss");try {String name sdf.format(new Date());String filePath System.getProperty("user.dir") "//" name ".sql";// 系统执行器Runtime rt Runtime.getRuntime();…

mysql 商品数据库设计_互联网产品mysql数据库设计总结

mysql数据库性能不比oracle数据库&#xff0c;所以设计上&#xff0c;和oracle有一些不同。下面总结一些互联网产品的数据库设计。1.主键主键可以使用bigint(20) unsigned也可以使用varchar&#xff0c;使用bigint&#xff0c;可以设置为自增主键auto_increment。使用varchar&a…

java多方式登陆_Java 爬虫遇到需要登录的网站,该怎么办?

这是 Java 网络爬虫系列博文的第二篇&#xff0c;在上一篇Java 网络爬虫&#xff0c;就是这么的简单中&#xff0c;我们简单的学习了一下如何利用 Java 进行网络爬虫。在这一篇中我们将简单的聊一聊在网络爬虫时&#xff0c;遇到需要登录的网站&#xff0c;我们该怎么办&#x…