"kron" 产品的多维版本?
Multidimensional version of "kron" product?
现在我有一个 N 乘以 p 的矩阵 A 和另一个 N 乘以 q 的矩阵 B。我想要的是一个矩阵,比如说 C,它的维数为 N 乘以 pq 使得
C(i,:) = kron(A(i,:), B(i,:));
如果N很大,遍历N行可能需要很长时间。所以目前我正在适当地增加 A 和 B(结合使用 repmat、permute 和 reshape)到将每个 N 维矩阵乘以 pq,然后用
之类的公式表示 C
C = A_aug .* B_aug;
有更好的主意吗?
检查一些 bsxfun
+ permute
+ reshape
魔法 -
out = reshape(bsxfun(@times,permute(A,[1 3 2]),B),size(A,1),[])
基准测试和验证
基准代码-
%// Setup inputs
N = 200;
p = 190;
q = 180;
A = rand(N,p);
B = rand(N,q);
disp('--------------------------------------- Without magic')
tic
C = zeros(size(A,1),size(A,2)*size(B,2));
for i = 1:size(A,1)
C(i,:) = kron(A(i,:), B(i,:));
end
toc
disp('--------------------------------------- With some magic')
tic
out = reshape(bsxfun(@times,permute(A,[1 3 2]),B),size(A,1),[]);
toc
error_val = max(abs(C(:)-out(:)))
输出-
--------------------------------------- Without magic
Elapsed time is 0.524396 seconds.
--------------------------------------- With some magic
Elapsed time is 0.055082 seconds.
error_val =
0
现在我有一个 N 乘以 p 的矩阵 A 和另一个 N 乘以 q 的矩阵 B。我想要的是一个矩阵,比如说 C,它的维数为 N 乘以 pq 使得
C(i,:) = kron(A(i,:), B(i,:));
如果N很大,遍历N行可能需要很长时间。所以目前我正在适当地增加 A 和 B(结合使用 repmat、permute 和 reshape)到将每个 N 维矩阵乘以 pq,然后用
之类的公式表示 CC = A_aug .* B_aug;
有更好的主意吗?
检查一些 bsxfun
+ permute
+ reshape
魔法 -
out = reshape(bsxfun(@times,permute(A,[1 3 2]),B),size(A,1),[])
基准测试和验证
基准代码-
%// Setup inputs
N = 200;
p = 190;
q = 180;
A = rand(N,p);
B = rand(N,q);
disp('--------------------------------------- Without magic')
tic
C = zeros(size(A,1),size(A,2)*size(B,2));
for i = 1:size(A,1)
C(i,:) = kron(A(i,:), B(i,:));
end
toc
disp('--------------------------------------- With some magic')
tic
out = reshape(bsxfun(@times,permute(A,[1 3 2]),B),size(A,1),[]);
toc
error_val = max(abs(C(:)-out(:)))
输出-
--------------------------------------- Without magic
Elapsed time is 0.524396 seconds.
--------------------------------------- With some magic
Elapsed time is 0.055082 seconds.
error_val =
0