矢量化代码

时间:2012-03-19 14:32:37

标签: matlab vectorization

我不太了解matlab的矢量化思维方式,主要是由于文档中提供的简单示例,我希望有人可以帮助我更好地理解它。

所以,我想要完成的是从ncols x nrows x ielements矩阵中取一个NxN样本,并计算每个ielement的平均值并存储平均值的最大值。使用for循环,代码如下所示:

for x = 1+margin : nrows-margin
    for y = 1+margin : ncols-margin
        for i=1:ielem
           % take a NxN sample 
           sample = input_matrix(y-margin:y+margin,x-margin:x+margin,i)
           % compute the average of all elements
           result(i) = mean2(sample);
        end %for i
      % store the max of the computed averages
      output_matrix(y,x)=max(result);
      end %for y
  end %for x

任何人都可以对这种情况的例子进行良好的矢量化吗? Ť

1 个答案:

答案 0 :(得分:2)

首先,由于在运行代码之前编译代码的增强功能,矢量化并不像以前那么重要,但它仍然是一种非常常见的做法,可以带来一些增强功能。较旧的Matlab版本一次执行一行,这将使for循环比相同代码的矢量化版本慢得多。

矩阵中可以被矢量化的部分是内部更多的循环。我将展示一个关于您要做什么的简单示例,我将让您举例并将其放入您的代码中。

input=randn(5,5,3);
max(mean(mean(input,1),2))

基本上,内部两个mean取输入数组的平均值,外部max将找到该范围内的最大值。如果你愿意,你可以一步一步地解决它,看看它做了什么。 mean(input,1)将取第一个维度的均值,mean(input,2)乘以第二个维度等。在前两个均值完成后,剩下的就是一个向量,max函数将很容易运行。应该注意的是,矢量pre-max的大小是[1 1 3],在执行此操作时会保留尺寸。