MATLAB的卷积功能可能会更快:
%1D情况:
b = conv(a,(2,1),'有效的') / 2;
%2D情况:
b = conv2(a,一个(2),,'有效的') / 4;
%3D案例:
b = convn(a,一个(2,2,2),'有效的') / 8;
概括为维度
n
(我认为)这样的事情:
b = convn(a,一个([2*一个(1,n),1]),'有效的') / 2^n;
(编辑)
至少在这种情况下似乎更快:
a = rand(100,100,100);
f1 = @()(a(2:end,2:end,2:end)+a(2:end,2:end,1:end-1:end-1)+a(2:end,1:end-1:end-1,1,2:end)+a(2:end,1:end-1,1:end-1)+...
a(1:end-1,2:end,2:end)+a(1:end-1,2:end,1:end-1)+a(1:end-1,1:end-1,1:end-1,1,12:end)+a(1:end-1,1:end-1,1:end-1)/8;
f2 = @()convn(a,一个(2,2,2),'有效的') / 8;
>> TimeIt(F1)
ans =
0.0430
>> TimeIt(F2)
ans =
0.0086
>>所有(abs(abs(f1() - f2())<0.000000001,'全部')
ans =
逻辑
1