我有三个大小2×2×2
的内核(如下ker1
、ker2
、ker3
定义)。我想知道如何确定这些内核是否可分离(出于3D
卷积目的)。我在网上阅读了如何在MATLAB
中为2D
内核完成此操作。但是3D
阵的等级!嗯,我不认为有这样的事情。也许其他方法?
主要问题是:1D
内核能否获得 3D 卷积的结果(不使用 FFT)?
MATLAB
命令convn
对于计算 3D 数组的卷积非常快。但是,我正在编写一个独立于MATLAB
的独立C++
应用程序,并且无法在我的代码中使用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 );
是的,所有这三个张量都可以写成三个向量的外积*
a*b*c
。
-
ker1 = [ 1,1] * [-1,1] * [ 1,1]
-
ker2 = [ 1,1] * [ 1,1] * [-1,1]
-
ker3 = [-1,1] * [ 1,1] * [ 1,1]
(这当然不是 Matlab 语法。您可以将第一个向量视为列向量,第二个向量视为行向量,第三个向量视为"top"向量。