相关疑难解决方法(0)

MATLAB中的索引向量是否效率低下?

背景

我的问题是由简单的观察推动的,这有点破坏了经验丰富的MATLAB用户经常持有/做出的信念/假设:

  • 当涉及内置函数和基本语言特性(如索引向量和矩阵)时,MATLAB得到了很好的优化.
  • MATLAB中的循环很慢(尽管有JIT),如果算法可以以原生的"矢量化"方式表示,通常应该避免.

底线:核心MATLAB功能是高效的,并且尝试使用MATLAB代码超越它是很困难的,如果不是不可能的话.

研究向量索引的性能

下面显示的示例代码是基本的:我为所有向量条目指定标量值.首先,我分配一个空向量x:

tic; x = zeros(1e8,1); toc
Elapsed time is 0.260525 seconds.
Run Code Online (Sandbox Code Playgroud)

x,我想它所有的项目设置为相同的值.在实践中,你会采用不同的方式,例如,x = value*ones(1e8,1)但这里的重点是研究向量索引的性能.最简单的方法是写:

tic; x(:) = 1; toc
Elapsed time is 0.094316 seconds.
Run Code Online (Sandbox Code Playgroud)

我们称之为方法1(从赋值的值x).它看起来非常快(至少比内存分配更快).因为我在这里做的唯一事情就是对内存进行操作,我可以通过计算获得的有效内存带宽并将其与计算机的硬件内存带宽进行比较来估算此代码的效率:

eff_bandwidth = numel(x) * 8 bytes per double * 2 / time
Run Code Online (Sandbox Code Playgroud)

在上面,我乘以2因为除非使用SSE流,否则在存储器中设置值要求向量既可以从存储器读取也可以写入存储器.在上面的例子中:

eff_bandwidth(1) = 1e8*8*2/0.094316 = 17 Gb/s
Run Code Online (Sandbox Code Playgroud)

我的计算机的STREAM基准内存带宽约为17.9 Gb/s,所以确实如此 - 在这种情况下,MATLAB可以提供接近峰值的性能!到现在为止还挺好.

Method 1 is suitable if you want to set all …

arrays performance matlab loops vectorization

51
推荐指数
3
解决办法
4471
查看次数

标签 统计

arrays ×1

loops ×1

matlab ×1

performance ×1

vectorization ×1