用MATLAB进行图像处理

图像处理概念,算法和MATLAB

无效的预先配置

今天我想解释一个MATLAB编码错误,我看到即使是有经验的MATLAB用户也会犯这个错误。

最近我在File Exchange上看一些代码,下面几行引起了我的注意:

Cm_data = 0 (m,3);hsv = rgb2hsv(厘米);cm_data = interp1 (linspace(0, 1,尺寸(厘米,1)),hsv, linspace (0 1 m));cm_data = hsv2rgb (cm_data);

具体来说,我被第一行和第三行打动了。第一行创建了一个全零矩阵。然后第三行代码丢弃第一行代码创建的矩阵,用的输出替换它interp1

我以前见过这样的代码。它源于对概念的误解预先配置在MATLAB。

在MATLAB中,预分配指的是创建一个矩阵(通常用0),然后进入一个循环,否则将重复调整矩阵的大小。

这里有一个例子。在下面的for循环中,为矩阵的大小x通过循环体,每次增加一个元素。

X = 0;K = 2:10000 x(K) = x(K -1) + 5;结束

在R2011a之前的MATLAB版本中,这种循环可能相当慢。原因是MATLAB会重新分配矩阵的内存空间x每次通过循环,导致$O(N^2)$执行时间。为了避免这种性能损失,通常的建议是创建完整大小的矩阵x在进入循环之前,像这样:

X = 0 (1,1000000);K = 2:10000 x(K) = x(K -1) + 5;结束

虽然自动数组增长得到在MATLAB R2011a中更加高效(它不再是$O(N²)$),预分配仍然有一些性能优势,这就是为什么它仍然是文档中有描述

但是,在File Exchange的代码中,矩阵cm_data不是在循环中生长。初始赋值的结果,Cm_data = 0 (m,3),就被丢弃了,从来没有被使用过。

MATLAB编辑器会告诉你这些。你看到下面第一行上的橙色曲线了吗?

如果你将鼠标悬停在曲线上,你会看到这个:

如果你点击详细信息按钮,你会得到完整的解释:

总之,不要担心调用0除非你在循环中增加一个矩阵。如果稍后用另一个函数调用返回的全新矩阵替换该变量,则对0对您没有帮助,甚至可能会减慢您的代码。




发布与MATLAB®R2016a

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。