我想对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循环。我可以对这个问题有一些看法吗?
答案 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语言无法使用外部产品。