鉴于Polygon是2维的信息,point是行向量而其他变量是标量,这是新函数的第一个版本(向下滚动以查看有很多方法可以为这只猫设置皮肤):

function [result] = newHitTest (point,Polygon,r,tol,stepSize)

result = 0;

linDiff = Polygon-repmat(point,size(Polygon,1),1);

testLogicals = sqrt( sum( ( linDiff ).^2 ,2 )) < tol*r;

if any(testLogicals); result = circleTest (point,Polygon,r,tol,stepSize); end

Matlab中矢量化的思考过程涉及尝试使用单个命令尽可能多地操作数据.大多数基本的内置Matlab函数在多维数据上运行非常有效.使用for循环与此相反,因为您将数据分解为较小的段以进行处理,每个段都必须单独解释.通过使用for循环进行数据分解,您可能会失去与Matlab内置函数背后的高度优化代码相关的一些巨大性能优势.

在您的示例中要考虑的第一件事是主循环中的条件中断.你无法摆脱矢量化过程.相反,计算所有可能性,为数据的每一行创建结果数组,然后使用any关键字查看是否有任何行已发出信号表示应调用circleTest函数.

注意:在Matlab中有效地有条件地打破计算是不容易的.但是,由于您只是在循环中计算欧几里德距离的形式,您可能会通过使用矢量化版本并计算所有可能性来看到性能提升.如果你的循环中的计算更昂贵,输入数据很大,并且你想在遇到某个条件时立即爆发,那么用编译语言编写的matlab扩展可能比矢量化版本快得多.你可能正在进行不必要的计算.但是,假设您知道如何使用编译为本机代码的语言编写与Matlab内置函数的性能相匹配的代码.

回到主题……

首先要做的是在Polygon和行向量点之间取线性差异(代码示例中为linDiff).要以矢量化方式执行此操作,2个变量的维度必须相同.实现此目的的一种方法是使用repmat复制每一行的点,使其与Polygon相同.但是,bsxfun通常是repmat(as described in this recent SO question)的优秀替代品,使代码成为……

function [result] = newHitTest (point,Polygon,r,tol,stepSize)

result = 0;

linDiff = bsxfun(@minus, Polygon, point);

testLogicals = sqrt( sum( ( linDiff ).^2 ,2 )) < tol*r;

if any(testLogicals); result = circleTest (point,Polygon,r,tol,stepSize); end

我通过在第二轴上求和将您的d值转换为d列(注意从Polygon中删除数组索引并在sum命令中添加2).然后我进一步评估逻辑数组testLogicals内联计算距离度量.您很快就会发现重载矢量化的缺点是它可以使代码对于不熟悉Matlab的人来说更不易读,但性能提升是值得的.评论是非常必要的.

现在,如果你想完全疯狂,你可以说测试函数现在非常简单,它保证使用’匿名函数’或’lambda’而不是完整的函数定义.是否值得执行circleTest的测试也不需要stepSize参数,这也许是使用匿名函数的另一个原因.您可以将测试转换为匿名函数,然后在调用脚本中使用circleTest,使代码在某种程度上自我记录. . .

doCircleTest = @(point,Polygon,r,tol) any(sqrt( sum( bsxfun(@minus, Polygon, point).^2, 2 )) < tol*r);

if doCircleTest(point,Polygon,r,tol)

result = circleTest (point,Polygon,r,tol,stepSize);

else

result = 0;

end

现在一切都是矢量化的,函数句柄的使用给了我另一个想法. . .

如果您计划在代码中的多个点执行此操作,那么重复if语句会有点难看.为了保持dry,将条件函数的测试放入单个函数似乎是明智的,就像在原始帖子中所做的那样.但是,该函数的效用将非常狭窄 – 它只测试是否应该执行circleTest函数,然后在需要时执行它.

现在想象一下,经过一段时间,你有一些其他的条件函数,就像circleTest一样,有自己的doCircleTest.很可能重用条件切换代码.为此,创建一个类似于原始函数的函数,它采用默认值,计算上廉价的测试函数的布尔结果,以及昂贵的条件函数及其相关参数的函数句柄……

function result = conditionalFun( default, cheapFunResult, expensiveFun, varargin )

if cheapFunResult

result = expensiveFun(varargin{:});

else

result = default;

end

end %//of function

您可以使用以下命令从主脚本中调用此函数. . .

result = conditionalFun(0, doCircleTest(point,Polygon,r,tol), @circleTest, point,Polygon,r,tol,stepSize);

…它的美妙之处在于你可以使用任何测试,默认值和昂贵的功能.对于这个简单的例子来说,或许有点矫枉过正,但是当我提出使用函数句柄的想法时,我的思绪就会徘徊.

matlab 代码 位图矢量化,性能 – matlab代码的矢量化相关推荐

  1. 使用MATLAB连接USRP实现收发OFDM功能代码说明

    OFDM小组跑通版代码说明 版权所有,未经授权,禁止转载! 以下内容使用USRP B210设备实现. 主要代码下载旧链接 或者此旧链接 [新版代码下载链接] 上述两个链接以第一个下载链接为主,如因文件 ...

  2. 常用的testbench和matlab代码之读取和写入文本代码

    常用的testbench和matlab代码之读取和写入文本代码 1.matlab写入文本 因为modelsim没有区分有无符号,所以需要先将十进制有符号数进行量化再转化为二进制数,然后写入文本.(量化 ...

  3. 在Matlab实现Kmeans算法(每行代码带注释)

    目录 一.前言 二.VQ概述 三.Kmeans算法 K-means 的算法步骤为: 四.Matlab代码实现过程 五. 一点点可选改动(个人看法) 参考链接: 一.前言 本人对机器学习.人工智能算法方 ...

  4. matlab的灰色关联,灰色关联度Matlab代码

    load x.txt %把原始数据存放在纯文本文件x.txt中,其中把数据的"替换替换成. for i=1:40 x(i,:)=x(i,:)/x(i,1); %标准化数据 end data= ...

  5. C++包扩展_利用 MATLAB Coder 将M代码生成C/C++代码

    利用MATLAB Coder将MATLAB代码生成C/C++代码​mp.weixin.qq.com MATLAB Coder 可以将MATLAB代码生成工程中常用的嵌入式或其他硬件平台的C或者C++代 ...

  6. python怎么运行matlab代码_用python运行matlab代码

    我得到了一个错误:Traceback (most recent call last): File "", line 1, in File "C:\Users\XYZ\Ap ...

  7. matlab 指数拟合原理,matlab指数增长和阻滞增长拟合代码.doc

    matlab指数增长和阻滞增长拟合代码 代码: t=1:13; x=[3.04,6.63,11.13,28.43,49.22,87.85,134.11,200.00,208.69,303.03,410 ...

  8. 阻滞增长函数matlab拟合,matlab指数增长和阻滞增长拟合代码讲课稿

    <matlab指数增长和阻滞增长拟合代码讲课稿>由会员分享,可在线阅读,更多相关<matlab指数增长和阻滞增长拟合代码讲课稿(7页珍藏版)>请在人人文库网上搜索. 1.资讯类 ...

  9. matlab中codegen是什么,从 MATLAB 代码生成 C/C++ 代码。 - MATLAB codegen - MathWorks 中国...

    -c生成 C/C++ 代码,但不调用 make 命令. -config:dll使用默认配置参数生成动态 C/C++ 库. -config:exe使用默认配置参数生成静态 C/C++ 可执行文件. -c ...

最新文章

  1. SDN教育城域网解决方案
  2. 跨界会对电商行业造成什么影响
  3. 通过Python脚本理解系统进程间通信
  4. 阿里云总裁张建锋:新型计算体系结构正在形成
  5. 在Bootstrap中使用类的按钮类型
  6. 通过影响函数理解黑箱预测
  7. 原生js实现吸顶导航和回到顶部特效
  8. Django组件 中间件
  9. 微信小程序自定义下拉刷新
  10. app客户端上传图片实现方式
  11. 科大讯飞麦克风阵列AIUI开放平台基本操作初级
  12. jetson nano笔记
  13. 体育测试成绩用什么软件制表,如何用电子表格进行体育成绩的统计.docx
  14. LTE学习笔记四:OFDM
  15. 小程序推广的6个超简单方案
  16. 【PTA】【C语言】书香节
  17. 松鼠的新家 LCA + 树上差分
  18. 使用网络模拟器packetTracer
  19. myeclipse2015 mac 序列号生成网址
  20. 三星手机微信连接不上服务器,三星S7手机微信收不到推送消息怎么办?快看看本文的方法能不能帮到你!...

热门文章

  1. ygo游戏王卡组_【YGO游戏王】异色眼——卡组构筑(文字版)
  2. 什么是地址解析协议 (ARP)?
  3. 机器人--避障技术盘点
  4. 打造软硬件结合的机器人:WuKonChatBot(悟空)聊天机器人
  5. mac录屏软件:ScreenFlow for Mac中文版
  6. new Date(date).getTime()不兼容苹果手机
  7. BNCT知识宝典(中文2022版)
  8. css图标代码 星,15个纯CSS实现的响应式土豪金星球类应用动画图标
  9. 字节跳动内部学习资料泄露!徐州java培训哪个好
  10. Vue中报错: Uncaught (in promise) Error:Redirected when going from “x“ to “x“ via a navigation guard