获取矩阵的中间

29次观看(最近30天)
XIN
XIN 2020年6月23日
评论: XIN2020年6月26日
大家好。我有一个有趣的情况。因此,想法是计算1D,2D或3D矩阵的中间点的值。
例如,A是100*100矩阵。我要获得的是一个99*99矩阵,它只表示3D矩阵A的平均值A。
我可以通过以下操作轻松地做到这一点:
b =(a(2:end,2:end)+a(2:end,1:end-1)+a(1:end-1,2:end)+a(1:end-end-1,1:END-1)/4;
但是,这相当慢,因为我需要参考4次。对于3D或大的A。我只是想知道是否有一种更快的方法来完成此任务,或者是否有任何可以更快地执行此操作的MATLAB函数?
非常感谢!

接受的答案

汤米
汤米 2020年6月23日
编辑:汤米 2020年6月23日
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
1条评论
XIN
XIN 2020年6月26日
谢谢汤米!这确实比以前快。我实际上在想是否还有其他更快的方法可以完成此任务。如果您有进一步的想法,我将非常感谢。
XIN

登录发表评论。

更多答案(0)

社区寻宝

在Matlab Central中找到宝藏,发现社区如何为您提供帮助!

开始狩猎!