gpt4 book ai didi

matlab - 为每个图像执行与新向量的卷积的最佳方法?

转载 作者:行者123 更新时间:2023-12-03 16:59:41 24 4
gpt4 key购买 nike

我试图找出执行一种卷积的最佳方法。

我有一个 3D 矩阵 I = [N x M x P] 和一个 2D 矩阵 S = [1 x 1 x K x P]。对于我的 3D 矩阵的每个第 p 帧(第三维),我想返回 I(:, :, p-K/2:p+K/2) 和 S(1, 1, :, p) 之间的有效卷积。您有办法做到这一点吗?

事实上,在计算操作数方面非常接近标准卷积,不同之处在于我需要为每一帧更改第二个矩阵...

这是我目前使用的方法:

% I = 3D matrix [N x M x P]
% S = Filter [1 x 1 x K x P] (K is an odd number)
% OUT = Result

[N, M, P] = size(I); % Data size
K = size(S, 3); % Filter length
win = (K-1)/2 ; % Window
OUT = zeros(size(I)); % Pre-allocation

for p = win+1:P-win
OUT(:, :, p) = convn(I(:, :, p-win:p+win), S(1, 1, :, p), 'valid'); % Perform convolution
end

最后我们的运算次数与标准卷积相同,唯一的区别是每一帧的过滤器不同......

有什么想法吗?

谢谢;)

最佳答案

所以你想用一个 1x1xKx1 的核对一个 NxMxK 的子图像进行卷积,然后只取有效部分,也就是一个 NxM 的图像。

让我们看看针对单个 (x,y) 位置的此操作。这个一维卷积,你只保留 1 个值,相当于子图像和你的内核的点积:

OUT(x,y,p) = squeeze(I(x,y,p-win:p+win))' * squeeze(S(1,1,:,p))

这可以通过将 I 的子图像 reshape 为 (N*M)xK 矩阵(K 是水平向量,S 是列向量)来对所有 (x,y) 进行矢量化。

在所有 p 中重复此操作最容易通过循环实现,就像您现在所做的那样。另一种方法是创建一个更大的 S,其中每列移动一个,因此您可以在 tge 两个矩阵之间进行单个点积。但是 S 也很容易创建,大概也需要一个循环。我不认为避免循环就是在 MATLAB 中再按一下(多年来它变得更快),而且产品本身可能是算法中最昂贵的部分。

关于matlab - 为每个图像执行与新向量的卷积的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46847659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com