matlab - 如何使用Matlab的bsxfun求解累加和

标签 matlab matrix vectorization bsxfun

我有以下(缓慢的)代码:

% A is n-by-m matrix
% B is n-by-m-by-d matrix
% C is n-by-m-by-d matrix
% R is 1-by-d vector

A=zeros(n,m);
for i=1:d
    A = A + sum(B(:,:,1:i),3).*(R(i)-C(:,:,i));
end

我想通过使用神奇的 bsxfun 来失去循环来提高效率。你能告诉我怎么做吗?

最佳答案

这边——

A = sum(cumsum(B,3).*bsxfun(@minus,permute(R,[1 3 2]),C),3)

大小参数 n,m,d 各为 200,运行时间为

----------------------------------- With Proposed Approach
Elapsed time is 0.054771 seconds.
----------------------------------- With Original Approach
Elapsed time is 2.514884 seconds.

使用 bsxfun 的更多理由和 vectorization !!


基准测试

基准代码-

n = 10;
m = 1000;
d = 3;
num_iter = 10000;

B = rand(n,m,d);
C = rand(n,m,d);
R = rand(1,d);

%// Warm up tic/toc.
for k = 1:100000
    tic(); elapsed = toc();
end

disp(['********************* d = ' num2str(d) ' ************************'])

disp('----------------------------------- With Proposed Approach')
tic
for iter = 1:num_iter
    A1 = sum(cumsum(B,3).*bsxfun(@minus,permute(R,[1 3 2]),C),3);
end
toc

disp('----------------------------------- With Original Approach')
tic
for iter = 1:num_iter
    
    A = zeros(n,m);
    for i=1:d
        A = A + sum(B(:,:,1:i),3).*(R(i)-C(:,:,i));
    end
end
toc

我这边的运行时是 -

********************* d = 3 ************************
----------------------------------- With Proposed Approach
Elapsed time is 0.856972 seconds.
----------------------------------- With Original Approach
Elapsed time is 1.703564 seconds.



********************* d = 9 ************************
----------------------------------- With Proposed Approach
Elapsed time is 2.098253 seconds.
----------------------------------- With Original Approach
Elapsed time is 9.518418 seconds.

关于matlab - 如何使用Matlab的bsxfun求解累加和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29620713/

相关文章:

java - LWJGL 矩阵堆栈意外行为

python - 有没有比使用循环和 iloc 更快的方法在小 Pandas 数据帧上进行整行比较?

python - 如何在numpy中向量化傅立叶级数部分和

matlab - 元胞阵列 reshape

c++ - Matlab legacy_code 工具 - 编写包装函数来捕获数组

r - 在 R 中创建距离矩阵(不使用 dist())

Matlab将函数: How do I get the solution of variable size,求解为矩阵形式?

multidimensional-array - 如何使用矢量化代码求解许多超定线性方程组?

oop - MATLAB - 相关属性和计算

java - Matlab 无法读取 JAR 资源