代码之家  ›  专栏  ›  技术社区  ›  Nick X Tsui

分批/并行进行一维卷积

  •  3
  • Nick X Tsui  · 技术社区  · 6 年前

    我有下面的代码,基本上在二维矩阵的每一行上做一维卷积。卷积核是相同的。所以真的是SIMD的案子。

    a = [   1,2,3,4,5;
            6,7,8,9,7; 
            7,6,2,3,4; 
            23, 54, 1, 3 ,7];
    
    f = [1,2,3];
    
    
    for n = 1:size(a,1)
        conv(a(n,:),f,'same')
    end
    

    当矩阵大小(和内核大小)变大时,速度就成了一个问题。我想知道有没有办法成批(并行化这个过程)?

    我做了类似的事情,但是结果与上面的代码不同:

    a = [   1,2,3,4,5;
            6,7,8,9,7; 
            7,6,2,3,4; 
            23, 54, 1, 3 ,7];
    
    f = [1,2,3];
    
    ff = repmat(f, [size(a,1) 1]);
    
    for n = 1:size(a,1)
        conv(a(n,:),f,'same')
    end
    
    convn(a,ff,'same')
    
    conv2(f,2,a,'same')
    

    附言: 我目前只寻求使用卷积的解决方案,而不是使用fft等效。

    1 回复  |  直到 6 年前
        1
  •  4
  •   fiveclubs    6 年前

    您需要使用二维卷积:

    conv2(1, f, a, 'same')
    

    conv2(a, f, 'same')
    

    在第一个方法中,第一个参数是 1 因为这是一个列卷积,根据你所说的,你只想做行卷积,这是用第二个参数处理的, f .

    来自的Matlab文档 conv2 :

    H1,然后用向量H2对结果的每一行进行卷积。

    卷积标量 1个 沿着列是一个标识操作,允许 f型 沿原始矩阵行卷积的向量,这是所需的结果。

    对于上面的第二种方法,这是两个输入矩阵的直接二维卷积,因此,如果您注意理解您的输入维数和参数顺序,这实际上会执行更快的操作。