【问题标题】:Multidimensional version of "kron" product?“克朗”产品的多维版本?
【发布时间】:2015-11-22 07:22:07
【问题描述】:

现在我有一个维度为 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;

有更好的主意吗?

【问题讨论】:

标签: matlab vectorization matrix-multiplication


【解决方案1】:

结帐一些 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多