Matlab 如何在不循环的情况下累积子矩阵(子阵列平滑)?

Matlab 如何在不循环的情况下累积子矩阵(子阵列平滑)?,matlab,signal-processing,arrays,Matlab,Signal Processing,Arrays,在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); % ma

在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
尝试:

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文件,它变得慢多了

我个人最近不得不加快代码的某些部分。作为一名专家,我建议尝试以下方法:

[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); 
1) 矢量化

摆脱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版本中有它)。 这将为您生成一个
.mex
文件,您可以调用它,因为它是您试图替换的函数


无论您选择(1)还是(2)),您都应该使用
tic来分析当前的实现;my_函数();toc
获取相当数量的函数调用,并将其与当前实现进行比较:

my_time = zeros(1,10000);
for count = 1:10000
    tic;
    my_function();
    my_time(count) = toc;
end
mean(my_time)

谢谢你的提示。我使用matlab profiler对代码进行benchamrek测试并找到瓶颈。生成一个MEX文件是一个好主意,但我没有想到它。将循环矢量化是我的第一个意图,但我还没有成功。accumarray和cumsum等函数没有用处。我可以使用hankel(1:n,n:M)生成一些索引,但它需要进一步的工作,例如使用meshgrid来创建所有索引,并且可能会变得更慢。嗯,我低估了矢量化的难度。您是否尝试过MEX文件方法