确定3D内核的可分性(1D内核可以得到3D卷积的结果吗?)

时间:2014-12-11 07:59:13

标签: matlab kernel

我有三个大小为2×2×2的内核(由ker1ker2ker3定义如下。我想知道如何确定这些内核是否可分离(用于3D卷积目的)。我读了online如何在MATLAB 2D内核中完成此操作。但是3D阵列的等级! mmmm,我不认为有这样的事情。也许其他方法?

主要问题是:1D内核可以得到3D卷积的结果(不使用FFT)吗?

MATLAB命令convn对于计算3D阵列的卷积非常快。但是,我正在编写一个独立于C++的独立MATLAB应用程序,并且无法在我的代码中使用convn。如果可以确定上述内核的可分离性,它将极大地帮助我在我的代码中使用1D卷积,这也很容易实现。

我很感谢在这个问题上得到社区朋友的想法。

>> % I am investigating this in MATLAB
ker1(:,:,1) =
    -1     1
    -1     1
ker1(:,:,2) =
    -1     1
    -1     1

>> 
ker2(:,:,1) =
    -1    -1
    -1    -1
ker2(:,:,2) =
     1     1
     1     1

>> 
ker3(:,:,1) =
    -1    -1
     1     1
ker3(:,:,2) =
    -1    -1
     1     1

>> my3Darray = ones( 200,200,200 );
>> res1 = convn( my3Darray, ker1 );
>> res2 = convn( my3Darray, ker2 );
>> res3 = convn( my3Darray, ker3 );

1 个答案:

答案 0 :(得分:1)

是的,所有这三个张量都可以写成三个向量*的外部产品a*b*c

  1. ker1 = [ 1,1] * [-1,1] * [ 1,1]
  2. ker2 = [ 1,1] * [ 1,1] * [-1,1]
  3. ker3 = [-1,1] * [ 1,1] * [ 1,1]
  4. (这当然不是Matlab语法。你可以把第一个向量看作列向量,第二个作为行向量,第三个作为'top'向量。)