执行二维矩阵的“外积”并在MATLAB中返回一个三维数组

时间:2017-08-20 11:56:07

标签: matlab product

我想对2-D矩阵进行操作,它看起来像是矢量的外积。我已经为这个任务编写了一些代码,但它很慢,所以我想知道是否有什么可以加速它。

我想首先展示我编写的代码,然后举例说明我想要完成的任务。

我的代码,版本逐行

function B = outer2D(A)
    B = zeros(size(A,1),size(A,2),size(A,2)); %Pre-allocate the output array
    for J = 1 : size(A,1)
        B(J,:,:) = transpose(A(J,:))*A(J,:); %Perform outer product on each row of A and assign to the J-th layer of B
    end
end

使用矩阵A = randn(30000,20)作为测试输入,花费0.317秒。

我的代码,逐页版本

function B = outer2D(A)
    B = zeros(size(A,1),size(A,2),size(A,2)); %Pre-allocate the output array
    for J = 1 : size(A,2)
        B(:,:,J) = repmat(A(:,J),1,size(A,2)).*A; %Evaluate B page-by-page
    end
end

使用矩阵A = randn(30000,20)作为测试输入,花费0.146秒。

示例1

A = [3 0; 1 1; 1 0; -1 1; 0 -2]; %A is the input matrix.
B = outer2D(A);
disp(B)

然后我会期待

(:,:,1) =

     9     0
     1     1
     1     0
     1    -1
     0     0


(:,:,2) =

     0     0
     1     1
     0     0
    -1     1
     0     4

B的第一行,[9 0; 0 0],是[3 0]的外积, 即[3; 0] * [3 0] = [9 0; 0 0]。

第二排B,[1 1; 1 1],是[1 1]的外积, 即[1; 1] * [1 1] = [1 1; 1 1]。

B的第三行,[1 0; 0 0],是[1 0]的外积, 即[1; 0] * [1 0] = [1 0; 0 0]。

其余行也一样。

示例2

A = 
0   -1  -2
0   1   0
-3  0   2
0   0   0
1   0   0

B = outer2D(A)
disp(B)

然后,类似于示例1,预期输出为

(:,:,1) =
 0     0     0
 0     0     0
 9     0    -6
 0     0     0
 1     0     0


(:,:,2) =
 0     1     2
 0     1     0
 0     0     0
 0     0     0
 0     0     0


(:,:,3) =
 0     2     4
 0     0     0
-6     0     4
 0     0     0
 0     0     0

因为我项目中的实际输入大小与30000×2000相同,并且此任务要执行多次。所以加速这项任务对我来说非常重要。

我正在考虑消除函数中的for循环。我可以对这个问题有一些看法吗?

2 个答案:

答案 0 :(得分:1)

自动扩展:

function B = outer2D(A)
    B=permute(permute(A,[3 1 2]).*A',[2 3 1]);
end

没有自动扩展:

function B = outer2Dold(A)
    B=permute(bsxfun(@times,permute(A,[3 1 2]),A'),[2 3 1]);
end

答案 1 :(得分:-4)

使用matlab语言无法使用外部产品。