在Matlab中快速平均3D子矩阵

时间:2016-06-21 15:58:55

标签: matlab loops for-loop matrix submatrix

让矩阵A的大小为sx x sy x sz。我想得到一个矩阵B(与A的大小相同),其中(x,y,z)处的B元素表示从同一位置提取的n x n x n子矩阵的平均值在A

我该怎么做?

我知道我可以使用convn或使用3个​​for循环执行此操作,但速度非常慢。

当我使用A时,我的机器上200 x 200 x 150大小double的矩阵n = 9大约需要20到30秒。

1 个答案:

答案 0 :(得分:3)

考虑使用图像处理工具箱中的imfilterimfilter本质上是一个利用Intel Integrated Performance Primitives的优化卷积和相关管道。就像一个简单的测试一样,让我们​​创建一个随机double精度200 x 200 x 150的3D矩阵,我们想要找到9 x 9 x 9像素邻域的平均值,如你所说:

A = rand(200,200,150);
kernel = (1/9^3)*ones(9,9,9);
B = imfilter(A, kernel);

这实际上在我的机器上运行得非常快。我的规格是配备16GB RAM的MacBook Pro,运行2.3 GHz Intel Core i7处理器。

为了满足好奇心,我使用timeit来计算分配内核和矩阵后此操作需要多长时间:

A = rand(200,200,150);
kernel = (1/9^3)*ones(9,9,9);
B = imfilter(A, kernel);
t = timeit(@() imfilter(A, kernel));

平均而言,上述代码运行约1.1393秒:

>> t

t =

    1.1393

除非你迁移到GPU,否则这对我来说是你获得它的最快方式...特别是因为你有150片200 x 200 2D数据你必须处理每个点收集一个9 x 9 x 9体积的元素。