Performance MATLAB缩放的repmat

Performance MATLAB缩放的repmat,performance,matlab,Performance,Matlab,有没有一种简单的方法可以在matlab中创建缩放的repmat 这个想法是,给定矩阵A和B 现在,我通过使用置换和重塑来完成这一任务,但置换操作占我脚本时间的90%。我想您正在寻找: 我认为您正在寻找: 您可能正在执行元素级乘法,从而生成一个巨大的数组,然后进行置换。现在,在一个大的阵列上进行排列将导致大量的数据传输,这将是无效的。所以,我猜你是在沿着这些思路做一些事情: reshape(permute(bsxfun(@times,A,permute(B,[3,4,1,2])),[1,3,2,4

有没有一种简单的方法可以在matlab中创建缩放的repmat

这个想法是,给定矩阵A和B


现在,我通过使用置换和重塑来完成这一任务,但置换操作占我脚本时间的90%。

我想您正在寻找:


我认为您正在寻找:


您可能正在执行元素级乘法,从而生成一个巨大的数组,然后进行置换。现在,在一个大的阵列上进行排列将导致大量的数据传输,这将是无效的。所以,我猜你是在沿着这些思路做一些事情:

reshape(permute(bsxfun(@times,A,permute(B,[3,4,1,2])),[1,3,2,4]),N,[]) 
           ^ (kills performance)    
另一种方法是在A和B上执行置换,然后在输入数组之间执行元素级乘法,这样我们最终只需要重新整形。相对而言,在A和B上排列应该更有效

因此,一个有效的解决方案是-

n = size(A,1)*size(B,1);
out = reshape(bsxfun(@times,permute(A,[1,3,2]),permute(B,[3,1,4,2])),n,[]);
运行时测试

让我们计时这两种方法来验证我们的性能改进,并包括@Shai的帖子中建议的基于kron的方法,这似乎是一个干净的解决方案-

% Max sized input arrays that my system could handle
A = randi(9,70,70);
B = randi(9,70,70);

disp('-------------- With permute on A and B and finally reshaping')
tic
n = size(A,1)*size(B,1);
out0 = reshape(bsxfun(@times,permute(A,[1,3,2]),permute(B,[3,1,4,2])),n,[]);
toc, clear out0 n

disp('-------------- With permute on elementwise result')
tic
n = size(A,1)*size(B,1);
out1 = reshape(permute(bsxfun(@times,A,permute(B,[3,4,1,2])),[1,3,2,4]),n,[]);
toc, clear out1 n

disp('-------------- With kron from @Shai post')
tic,
result1 = kron(B, A);
toc
时间安排-

-------------- With permute on A and B and finally reshaping
Elapsed time is 0.161598 seconds.
-------------- With permute on elementwise result
Elapsed time is 0.413746 seconds.
-------------- With kron from @Shai post
Elapsed time is 0.612825 seconds.

您可能正在执行元素级乘法,从而生成一个巨大的数组,然后进行置换。现在,在一个大的阵列上进行排列将导致大量的数据传输,这将是无效的。所以,我猜你是在沿着这些思路做一些事情:

reshape(permute(bsxfun(@times,A,permute(B,[3,4,1,2])),[1,3,2,4]),N,[]) 
           ^ (kills performance)    
另一种方法是在A和B上执行置换,然后在输入数组之间执行元素级乘法,这样我们最终只需要重新整形。相对而言,在A和B上排列应该更有效

因此,一个有效的解决方案是-

n = size(A,1)*size(B,1);
out = reshape(bsxfun(@times,permute(A,[1,3,2]),permute(B,[3,1,4,2])),n,[]);
运行时测试

让我们计时这两种方法来验证我们的性能改进,并包括@Shai的帖子中建议的基于kron的方法,这似乎是一个干净的解决方案-

% Max sized input arrays that my system could handle
A = randi(9,70,70);
B = randi(9,70,70);

disp('-------------- With permute on A and B and finally reshaping')
tic
n = size(A,1)*size(B,1);
out0 = reshape(bsxfun(@times,permute(A,[1,3,2]),permute(B,[3,1,4,2])),n,[]);
toc, clear out0 n

disp('-------------- With permute on elementwise result')
tic
n = size(A,1)*size(B,1);
out1 = reshape(permute(bsxfun(@times,A,permute(B,[3,4,1,2])),[1,3,2,4]),n,[]);
toc, clear out1 n

disp('-------------- With kron from @Shai post')
tic,
result1 = kron(B, A);
toc
时间安排-

-------------- With permute on A and B and finally reshaping
Elapsed time is 0.161598 seconds.
-------------- With permute on elementwise result
Elapsed time is 0.413746 seconds.
-------------- With kron from @Shai post
Elapsed time is 0.612825 seconds.

您应该共享您当前的代码。置换和重塑速度相当快。请将示例数据与所需输出共享。您应该共享当前代码。置换和重塑速度相当快。请分享一个示例数据和你想要的结果。你的回答真的很有帮助。我目前的瓶颈是kron/bsxfun操作之后的求和函数。基本上A和B现在是三维的。假设k=5。A=randi9,70,70,5;B=randi9,70,70,5;out0=reshapesumbsxfun@timespermuteA,[1,4,2,5,3],permuteB,[4,1,5,2,3],5,n,n2,[];这比使用我原来的排列要慢得多,是否有内置函数来实现这一点?我想使用CUDA,但不想实现我自己的内核。@Felipe有了这些新的需求,发布一个新问题会更有意义。你可以把这些代码移到新问题上。你的回答真的很有帮助。我目前的瓶颈是kron/bsxfun操作之后的求和函数。基本上A和B现在是三维的。假设k=5。A=randi9,70,70,5;B=randi9,70,70,5;out0=reshapesumbsxfun@timespermuteA,[1,4,2,5,3],permuteB,[4,1,5,2,3],5,n,n2,[];这比使用我原来的排列要慢得多,是否有内置函数来实现这一点?我想使用CUDA,但不想实现我自己的内核。@Felipe有了这些新的需求,发布一个新问题会更有意义。你可以把这些代码转移到新问题上。