百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

轻松掌握MATLAB - 2.4 数组的内存管理与矩阵思想

bigegpt 2024-09-24 07:27 4 浏览

上一篇:轻松掌握MATLAB - 2.3 数组的索引与变换


2.4.1 数组的内存管理

在MATLAB中,数值型数组在内存中是连续存储的。MATLAB会为每个数组分配一块连续的内存空间,并按照列优先的原则将数组的元素依次存入内存单元。一旦数组的大小发生变化,MATLAB 就会重新分配一块适合新数组的内存,将数据复制过去,并释放原来数组占用的内存。在程序运行过程中,如果数组的大小不断变化,MATLAB 就会频繁地进行内存分配和回收,这将严重影响程序的运行效率。因此,尽管 MATLAB 并不要求用户主动管理内存,对于较大的数组,我们应该养成提前为其分配内存的习惯,以避免因数组在程序中不断“长大”而影响程序的运行效率

如我们在第一章中所述,最初版本的 MATLAB 是基于 Fortran 语言开发的,因此它继承了 Fortran 语言中 “列优先” 存储数组的习惯。在MATLAB中对数组进行存取操作时,为了充分利用计算机的缓存机制,避免因在内存中四处寻址造成的效率损失,应按照“列优先”的顺序来对数组进行索引和修改

下面我们通过一个例子,来直观的比较一下上述两条原则对数组访问效率的影响。如下代码将创建一个r行c列的矩阵M,M中的元素等于其所在位置的行、列坐标之和。程序比较了不预分配内存且行优先、不予分配内存且列优先、预分配内存且行优先,以及预分配内存且列优先这四种情况下程序完成相同工作的耗时。在Editor中录入如下代码并保存为compareArrayIndexing.m,然后点击Editor工具栏上的Run按钮运行程序。可以修改变量r和c的值,反复运行compareArrayIndexing.m,观察对不同大小的数组这4种方法的区别程度。体会MATLAB中使用数组的要点。

clear 
r = 5000; %数组的行数,根据需要修改
c = 5000; %数组的列数,根据需要修改

%% ---------------------------------------不预分配内存
tic
for m=1:r %行优先
    for n=1:c
        M(m,n) = m+n;
    end
end
fprintf('未预分配内存,行优先耗时%f s\n',toc)

clear M %清除变量,回收内存
tic
for n=1:c %列优先
    for m=1:r
        M(m,n) = m+n;
    end
end
fprintf('未预分配内存,列优先耗时%f s\n',toc)

clear M %清除变量,回收内存
%% ---------------------------------------预分配内存
tic
M = zeros(r,c);  %预分配内存
for m=1:r %行优先
    for n=1:c
        M(m,n) = m+n;
    end
end
fprintf('预分配内存,行优先耗时%f s\n',toc)

clear M %清除变量,回收内存
tic
M = zeros(r,c); %预分配内存
for n=1:c %列优先
    for m=1:r
        M(m,n) = m+n;
    end
end
fprintf('预分配内存,列优先耗时%f s\n',toc)

上图所示是在r和c均为5000时的运行结果。可以看出,预分配内存且列优先的情况下,耗时是最少的。而未预分配内存且行优先情况下,则耗时最多。后者的耗时是前者的900多倍!计算机的硬件配置不同,每种方法消耗的具体时间可能不同,但结论是一致的:为大数组预分配内存,并遵循MATLAB的“列优先”原则来存取数组,可以显著提高程序的运行效率。数组越大,效果越明显。


【说明】

  • for是MATLAB的循环语句之一,它通过用循环变量index按列遍历一个数组loopArray,反复执行介于for和end之间statements。循环的总次数等于size(loopArray,2)。其基本语法如下:
for index = loopArray
			statements
end
  • tic和toc是MATLAB用来计时的两个函数,就像秒表的“滴答”声,tic开始计时,toc停止计时。
  • “拙匠常怪工具差”!MATLAB编程中除了算法方面的原因外,绝大多少效率问题都是因“内存使用不当”造成的!

2.4.2 矩阵思想与代码向量化

与其他语言(如c语言)中基于循环且面向标量的运算方式不同,MATLAB中绝大部分数值计算相关的内置函数和所有的算术运算符都支持直接对矩阵进行运算,特别是底层的函数库都针对涉及矩阵和向量的运算进行了深度的优化。因此,在MATLAB中进行编程时,将矩阵视为基本数据单元,基于矩阵和向量来思考问题,从而摆脱掉不必要的循环,才能最大程度的发挥MATLAB的优势。这种编程思路称为矩阵思想。按矩阵思想编写的代码称为向量化代码(Vectorized code)或矩阵化代码。遵循矩阵思想编程可以带来诸多好处:

  • 代码容易理解。向量化代码与教科书上的数学表达式高度一致,这使得代码易读、易理解。
  • 由于摆脱了循环,代码更简短,不易出错。
  • 运行效率高。向量化代码往往比循环执行效率要高。

例如,分别用标量化和矢量化代码计算一个向量x的正弦:

%% 标量化的代码
tic
m = 0;
for x = 0:pi/1000:2*pi
    m = m+1;
    y(m) = sin(x);
end
t1 = toc;

%% 向量化代码
tic
x = 0:pi/1000:2*pi;
y = sin(x); 
t2 = toc;
fprintf('矢量化后代码运行速度提高了%.2f倍。\n',t1/t2)

上述标量化的代码中,需要使用一个循环将向量x的各个元素逐一传递给sin函数进行计算,而向量化的代码则将向量x作为一个整体传递给了sin函数。显然,基于矩阵思想的代码更简洁、高效和易于理解。MATLAB 的sin函数不仅支持向量,即使将矩阵,甚至是多维数组直接传递给它,也可以直接得到计算结果。

MATLAB的加+、减-、点乘.*、点除./和点乘方.^也都是向量化算符,它们对“兼容数组”进行对应元素运算。例如,

上述3行代码将全1矩阵a的每一列依次增加了1。若用循环思想,需要两重循环,逐个元素操作。而用矩阵思想,只需创建另一个矩阵,一次性完成。

类似的,将a逐列乘数增加1:

算符*和/分别用于矩阵相乘和相除。需要注意的是,这两个算符不是向量化的算符,必须满足矩阵的运算规则,否则MATLAB会报错。例如,

从报错信息可以看出,报错的原因在于a和b不满足矩阵乘法的条件:第一个矩阵的列数等于第二个矩阵的行数。


【说明】

  • 向量化的函数和算符虽然也支持多维数组,但在处理多维数组时效率会比矩阵低一些,特别是在多维数组比较大的情况下。这主要是内存管理导致的效率损失。
  • 在编程过程中,要养成使用.*./.^的习惯,只有在涉及真正的矩阵运算时才使用*/^算符。这样有利于提高代码的向量化程度和运行效率。
  • 关于MATLAB的运算符,将在第四章中详细介绍。

思考与练习

  1. 辨析MATLAB中的几个概念:数组、矩阵、向量、标量?空数组的维度是0吗,如何查询其维度?
  2. 生成一个3x4元素均10的矩阵,你能想到几种方法?
  3. 已知A = magic(5),将A中小于10的元素设置为0。
  4. 已知A = magic(5),如何将A中所有的元素都从小到大排列?
  5. 常用的索引数组元素的方法有哪几种?一般来说哪种方法效率最高?
  6. 在命令行doc sort,然后点击帮助文档上方的Functions,可以列出MATLAB提供的矩阵与数组相关的函数。本节已经演示了其中部分函数的常见用法。了解这些函数及其基本功能,以备不时之需。
  7. 本章的示例程序compareArrayIndexing.m中,为了演示不同数组存取方法的效率,代码是采用的是循环思想编写的。思考一下,基于矩阵思想如何创建满足同样要求的矩阵M?



下一篇: 前第二章的内容发布完毕。片均阅读量达到1000后再发布后续章节

相关推荐

5分钟调色大片的方法(5分钟调色大片的方法有哪些)

哈喽大家好。在大家印象中一定觉得ps非常难学非常难。大家不要着急,小编的教学都是针对ps零基础的同学的,而且非常实用哦。只要大家跟着图文练习一两遍,保证大家立马学会~!好了,废话少说,下面开始我们今天...

闪白特效原来是这么用的(闪白特效怎么使用)

作者|高艳侠订阅|010-86092062闪白特效是影视作品中应用比较多的效果之一,那么具体该在哪些场景使用闪白特效?具体该如何操作?下面就以AdobePremiere(以下简称PR)为例,...

ppt常用小图标去哪里找?3个矢量素材网站推荐!

ppt是一个注重可视化表达的演示载体,除了高清图片,ppt中另一类常用的素材是各种小图标,也叫矢量图标,巧妙运用小图标能提升整体美观度和表现力,那么ppt常用小图标去哪里找呢?为方便各位快速找到合适的...

有什么好用的截图录屏工具?试试这9款

经常有朋友反馈苦于缺乏截屏和录屏的趁手工具,本期我们分享几个相当好用的截屏和录屏工具,希望能帮到大家。ScreenToGifScreenToGif是一款免费且开源的录屏工具。此款工具最大的特点是可以...

配色苦手福音!专业快速色环配色PS插件

今天橘子老师给的大家介绍的是一款快速配色的插件,非常强大配色苦手福音来啦!(获取方式见文末)【插件介绍】配色在后期设计中占有主导地位,好的配色能让作品更加抢眼Coolorus这款专业的配色插件,能够...

如何用PS抠主体?(ps怎么抠主体)

1.主体法抠图-抠花苞和花梗导入一张荷花苞的照片,点击上图中顶部“选择”菜单栏,下拉单击“主体”。可以看到,只有花苞被选中,但是花梗并没有被选中。接下来单击上图中左侧工具栏的“快速选择工具”,上图中顶...

2799元的4K电视,有保障吗?(买4k电视机哪个品牌好)

在上一期《电脑报》的3·15专题报道中,我们揭露了一款不靠谱的42英寸4K智能电视——TCLD42A561U。这款售价2699元的4K智能电视不仅4K画质方面存在严重问题,而且各种功能和应用体验也不理...

苹果电脑的Touch Bar推出一段时间了 这款工具可以帮你开发适用于它的APP

距离苹果推出带有TouchBar的MacBookPro已经有一段时间了,除了那些像Adobe、Google和Microsoft大公司在开发适用于TouchBar的应用之外,其实还有很多独立的开...

如魔法般吸取颜色的桌灯(如魔法般吸取颜色的桌灯叫什么)

色彩为生活带来的感官刺激,逐渐被视为理所当然。一盏桌灯运用它的神奇力量,将隐藏于物件中的颜色逐一释放,成为装点环境的空间魔法师。ColorUp是一款可以改变颜色的吸色台灯,沿用传统灯泡的造型,融入了拾...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

ps拾色器快捷键是什么?(ps2019拾色器快捷键)

ps拾色器快捷键是什么?文章末尾有获取方式,按照以下步骤就能自动获得!学会制作PS特效需要一定程度的耐心和毅力。初学者可以从基本的工具和技术开始学习,逐渐提高他们的技能水平。同时,观看更多优秀的特效作...

免费开源的 Windows 截图录屏工具,支持 OCR 识别和滚动截图等

功能很强大、安装很小巧的免费截图、录屏工具,提供很多使用的工具来帮我么能解决问题,推荐给大家。关于ShareXShareX是一款免费的windows工具,起初是一个小巧的截图工具,经过多年的迭...

入门到精通系列PS教程:第13篇 · 拾色器、颜色问题说明及补充

入门到精通系列PS教程:第13篇·拾色器、颜色问题说明及补充作者|侯潇问题说明我的第12篇教程里,有个小问题没有说清楚。要说是错误,又不算是错误,只是没有说准确。写完那篇教程后,因为已经到了深...

PS冷知识:用吸管工具吸取屏幕上的任意颜色

今天,我们给大家介绍PS中的一个冷知识:用吸管工具可以吸取屏幕上的任意颜色。其实,操作起来是非常简单的。大多数情况下,我们认为,PS的吸管工具只能吸取PS软件作图区域范围内的颜色,最多加上画布四周的...

Windows 11 将提供内置颜色选择器工具

Windows11内置了颜色选择器,可以扫描并识别屏幕上的颜色并生成颜色代码。此外,微软还利用人工智能技术,让屏幕上的文本扫描和选择变得更加便捷。这两项功能均已在SnippingToolv1...