"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(结合使用 repmatpermutereshape)到将每个 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