matlab - 两个 for 循环的向量化(矩阵创建和阈值化)

标签 matlab vectorization

如何向量化此 MATLAB 函数:

function [win,vec] = createwin(data,shift,regions,threshold)
% 
% data      ... 1D data array
% shift     ... positive integer scalar
% regions   ... integer index vector 
% threshold ... integer scalar
%
win = zeros(length(data),2*shift+1);
for i = 1+shift:length(data)-shift
   win(i,:) = data(i-shift:i+shift);
end

vec = false(size(data));
for i = 1:length(regions)
    ii = max(1+shift, regions(i)-shift):min(length(data)-shift, regions(i)+shift);
    vec(ii) = data(ii) >= threshold & data(ii) >= win(ii);
end

我只是添加了第二个 for 循环,它现在是这段代码的瓶颈。 那么,知道如何向量化第二个循环吗?

和一些测试用例:

[win,vec]=createwin(1:20,3,[2:18],10)

预期结果是:

赢=

 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 1     2     3     4     5     6     7
 2     3     4     5     6     7     8
 3     4     5     6     7     8     9
 4     5     6     7     8     9    10
 5     6     7     8     9    10    11
 6     7     8     9    10    11    12
 7     8     9    10    11    12    13
 8     9    10    11    12    13    14
 9    10    11    12    13    14    15
10    11    12    13    14    15    16
11    12    13    14    15    16    17
12    13    14    15    16    17    18
13    14    15    16    17    18    19
14    15    16    17    18    19    20
 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 0     0     0     0     0     0     0

vec =

 0     0     0     0     0     0     0     0     0     1     1     1     1     1     1     1     1     0     0     0

最佳答案

一种方法 bsxfun -

win = zeros(size(data,1),2*shift+1)
row_id = 1+shift:size(data,1)-shift
win(row_id,:) = data(bsxfun(@plus,row_id(:),[-shift:shift]))

请注意,对于预分配,您也可以使用此 faster scheme -

win(size(data,1),2*shift+1) = 0;

关于matlab - 两个 for 循环的向量化(矩阵创建和阈值化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28854376/

相关文章:

matlab - matlab中的垂直反射?

python - 数据帧中的矢量化标志分配

python - 是否可以在不使用for循环的情况下将矩阵A中的所有列与矩阵B中的每一列相乘?

arrays - 用值填充二进制向量中的奇数序列

c++ - 可以使用 -fsanitize=address 运行 MEX 文件吗?

matlab - matlab 中非均匀网格上的 3 维傅里叶变换

matlab - 在matlab中关闭GUI时执行的函数

matlab - 在 Matlab 中区分彩色掩模

python - Rec 的用户-项目矩阵中共同评分项目的矢量化计算。系统

python - 在返回向量的函数上使用 Numpy Vectorize