如何对此代码进行矢量化?

时间:2014-05-22 21:10:26

标签: arrays performance matlab matrix vectorization

首先,我应该说我无法找到适合我的问题的标题,所以我很感激任何会编辑标题的人!
假设我有一个18432x1472矩阵,我希望以这种形式将其转换为3072x1472(18432/6 = 3072):
旧矩阵的元素(1,6),(2,6),...,(6,6)的平均值将转到新矩阵的元素(1,1) 旧矩阵的元素(7,6),(8,6),...,(12,6)的平均值将转到新矩阵的元素(2,1),依此类推 到目前为止,我已经编写了这段代码:

function Out = MultiLooking( In )
   MatrixIn = double(In);
   m = size(In,1);
   InTranspose = MatrixIn';
   A = zeros(m,m/6);
   for i = 1:(m/6)
       A(6*(i-1)+1,i) = 1;
       A(6*(i-1)+2,i) = 1;
       A(6*(i-1)+3,i) = 1;
       A(6*(i-1)+4,i) = 1;
       A(6*(i-1)+5,i) = 1;
       A(6*(i-1)+6,i) = 1;
   end
   X = (InTranspose*A)/6;
   Out1 = X';
   Out = uint8(Out1);
end

但它速度慢,对于我的极化SAR数据,计算机在运行此代码时会暂停一段时间,因此我需要代码运行得更快! 任何人都可以建议我更快的代码来实现这个目的???

2 个答案:

答案 0 :(得分:5)

Divakar's nice answer的替代方法:使用blockproc(图像处理工具箱):

blockproc(MatrixIn, [6 size(MatrixIn,2)], @(x) mean(x.data))

答案 1 :(得分:4)

试试这个 -

%// Assuming MatrixIn is your input matrix
reshape(mean(reshape(MatrixIn,6,[])),size(MatrixIn,1)/6,[]) 

使用单元格数组的替代解决方案(虽然比以前的代码提高了性能) -

c1 = cellfun(@mean,mat2cell(MatrixIn,6.*ones(1,size(MatrixIn,1)/6),size(MatrixIn,2)),'uni',0)
out = vertcat(c1{:})