在Matlab中我需要累积大矩阵的重叠对角块。示例代码如下。
由于这段代码需要多次运行,因此会消耗大量资源。该过程用于阵列信号处理,用于所谓的子阵列平滑或空间平滑。有没有办法更快地做到这一点?
% some values for parameters
M = 1000; % size of array
m = 400; % size of subarray
n = M-m+1; % number of subarrays
R = randn(M)+1i*rand(M);
% main code
S = R(1:m,1:m);
for i = 2:n
S = S + R(i:m+i-1,i:m+i-1);
end
ATTEMPTS:
1)我尝试了以下替代矢量化版本,但遗憾的是它变慢了!
[X,Y] = meshgrid(1:m);
inds1 = sub2ind([M,M],Y(:),X(:));
steps = (0:n-1)*(M+1);
inds = repmat(inds1,1,n) + repmat(steps,m^2,1);
RR = sum(R(inds),2);
S = reshape(RR,m,m);
2)我使用Matlab编码器创建一个MEX文件,它变慢了!
答案 0 :(得分:-1)
我个人最近不得不紧紧处理我代码的某些部分。根本不是专家,我建议尝试以下方法:
1) Vectorize :
摆脱for循环
S = R(1:m,1:m);
for i = 2:n
S = S + R(i:m+i-1,i:m+i-1)
end
并将其替换为基于cumsum
的替代方案应该是这里的方法。
注意:将在未来的编辑
上尝试使用此方法2)生成MEX文件:
在某些情况下,您可以简单地启动Matlab Coder app(假设您在当前的Matlab版本中拥有它)。
这应该为您生成一个.mex
文件,您可以调用它,因为它是您要替换的函数。
无论您选择(1)还是2)),您都应该使用tic; my_function(); toc;
对当前实现进行分析,以获得相当多的函数调用,并将其与您当前的实现进行比较:
my_time = zeros(1,10000);
for count = 1:10000
tic;
my_function();
my_time(count) = toc;
end
mean(my_time)