0

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

我该怎么做?

我知道我可以使用convn或使用 3 个for循环来做到这一点,但它会很慢。

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

4

1 回答 1

3

考虑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卷元素。

于 2016-06-21T16:32:45.980 回答