让我的矩阵的大小A
是sx x sy x sz
. 我想得到一个矩阵B
(大小与 相同A
),其中 B 的元素表示从 相同位置提取(x,y,z)
的子矩阵的平均值。n x n x n
A
我该怎么做?
我知道我可以使用convn
或使用 3 个for
循环来做到这一点,但它会很慢。
A
当我使用时,尺寸矩阵在我的机器上200 x 200 x 150
是double
精确的,n = 9
大约需要 20 到 30 秒。
考虑imfilter
从图像处理工具箱中使用。 imfilter
本质上是一个优化的卷积和相关管道,它利用了英特尔集成性能原语。就像一个简单的测试一样,让我们创建一个随机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);
这实际上在我的机器上运行得非常快。我的规格是运行 2.3 GHz Intel Core i7 处理器的 16GB RAM 的 MacBook Pro。
只是为了满足好奇心,我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卷元素。