2012-03-19 47 views
1

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

所以,我试图完成的是从ncols x nrows x ielements的矩阵中取NxN的样本,并计算每个元素的平均值并存储平均值的最大值。使用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 

任何人都可以做一个很好的向量化的这种情况的例子吗? T

+0

你应该看看'conv2'或'filter2'函数。 – 2012-03-19 14:36:48

+0

我会,但有没有其他的方式来矢量化这种类型的代码,而不使用像conv2或filter2这样的函数,并使用更多的矩阵索引? – VisLab 2012-03-19 14:45:09

回答

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],在执行此操作时将保留尺寸。