Matlab 多维版本的;克朗“;产品?
现在我有一个矩阵a的维数是N乘以p,另一个矩阵B的维数是N乘以q。我想要的是一个矩阵,比如说C,维数N乘以pq,这样Matlab 多维版本的;克朗“;产品?,matlab,vectorization,matrix-multiplication,Matlab,Vectorization,Matrix Multiplication,现在我有一个矩阵a的维数是N乘以p,另一个矩阵B的维数是N乘以q。我想要的是一个矩阵,比如说C,维数N乘以pq,这样 C(i,:) = kron(A(i,:), B(i,:)); 如果N较大,则在N行上循环可能需要相当长的时间。因此,目前我正在适当地增加A和B(结合使用repmat、permute和reforme),以将维度N的每个矩阵转化为pq,然后用类似的公式表示C C = A_aug .* B_aug; 有更好的主意吗?检查一下++魔术- 基准测试与验证 基准测试代码- %// Se
C(i,:) = kron(A(i,:), B(i,:));
如果N较大,则在N行上循环可能需要相当长的时间。因此,目前我正在适当地增加A和B(结合使用repmat、permute和reforme),以将维度N的每个矩阵转化为pq,然后用类似的公式表示C
C = A_aug .* B_aug;
有更好的主意吗?检查一下++魔术-
基准测试与验证 基准测试代码-
%// 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
查看MATLAB的FileExchange上的
superkron
-
--------------------------------------- Without magic
Elapsed time is 0.524396 seconds.
--------------------------------------- With some magic
Elapsed time is 0.055082 seconds.
error_val =
0