2012-03-19 48 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],在執行此操作時將保留尺寸。