让矩阵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秒。
答案 0 :(得分:3)
考虑使用图像处理工具箱中的imfilter
。 imfilter
本质上是一个利用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体积的元素。