首先,我应该说我无法找到适合我的问题的标题,所以我很感激任何会编辑标题的人!
假设我有一个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数据,计算机在运行此代码时会暂停一段时间,因此我需要代码运行得更快! 任何人都可以建议我更快的代码来实现这个目的???
答案 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{:})