如何在窗口m中选择序列的n个元素?(matlab)



快速MATLAB问题。选择一定数量的元素的最佳/最有效的方法是什么,在m的窗口中选择n。换句话说,我想选择序列的前50个元素,然后是10-60个元素,然后是20-70个元素等等。现在,我的序列是矢量格式(但这可以很容易地改变)。

编辑:我正在处理的序列太长,无法存储在我的RAM中。我需要能够创建窗口,然后调用我想要分析/执行另一个命令的窗口。

您是否有足够的RAM在内存中存储50 × nwindow数组?在这种情况下,您可以一次生成窗口,然后对每个列应用您的处理

%# idxMatrix has 1:50 in first col, 11:60 in second col etc
idxMatrix = bsxfun(@plus,(1:50)',0:10:length(yourVector)-50); %'#
%# reshapedData is a 50-by-numberOfWindows array
reshapedData = yourVector(idxMatrix);
%# now you can do processing on each column, e.g.
maximumOfEachWindow = max(reshapedData,[],1);

补充Kerrek的答案:如果你想在循环中执行,你可以使用像

这样的东西
n = 50
m = 10;
for i=1:m:length(v)
    w = v(i:i+n);
    % Do something with w
end

你对问题的描述有一点小问题。你说你想要"选择序列的前50个元素,然后是10-60个元素……";但是,这将转换为选择元素:

  • 1-50
  • 60
  • 20 - 70
  • 等。

第一个序列应该是0-10,以适应模式,当然在MATLAB中没有意义,因为数组使用一个索引。为了解决这个问题,下面的算法使用一个名为startIndex的变量来指示从哪个元素开始序列采样。

您可以通过构造索引数组以矢量化的方式完成此操作。创建一个由每个序列的起始索引组成的向量。为了重用,我将序列的长度、序列开始之间的步长和最后一个序列的开始作为变量。在你描述的例子中,序列的长度应该是50,步长应该是10,最后一个序列的开始取决于输入数据的大小和你的需要。

<>之前>> startIndex = 10;>> sequenceSize = 5;>> finalSequenceStart = 20;之前

创建一些示例数据:

<>之前>> sampleData = randi(1,1,28)sampleData =第1至18列8 53 10 82 82 73 15 66 52 98 65 81 46 44 83 9 14 18第19到28列40 84 81 7 40 53 42 66 63 30之前

创建一个包含序列起始索引的向量:

<>之前>> sequenceStart = startIndex:sequenceSize:finalSequenceStartsequenceStart =10 15 20之前

创建一个索引数组来索引数据数组:

<>之前>> index = cumsum(ones(sequenceSize, length(sequenceStart)))指数=1 1 12 2 23 3 34 4 45 5 5>> index = index + repmat(sequenceStart, sequenceSize, 1) - 1指数=10 15 2011 16 2112 17 2213 18 2314 19 24之前

最后,使用这个索引数组来引用数据数组:

<>之前>> sampleData(索引)ans =98 83 8465 9 8181 14 746 18 4044 40 53

使用(start : step : end)索引:v(1:1:50), v(10:1:60)等。如果step1,可以省略:v(1:50)

考虑以下矢量化代码:

x = 1:100;                                     %# an example sequence of numbers
nwind = 50;                                    %# window size
noverlap = 40;                                 %# number of overlapping elements
nx = length(x);                                %# length of sequence
ncol = fix((nx-noverlap)/(nwind-noverlap));    %# number of sliding windows
colindex = 1 + (0:(ncol-1))*(nwind-noverlap);  %# starting index of each
%# indices to put sequence into columns with the proper offset
idx = bsxfun(@plus, (1:nwind)', colindex)-1;   %'
%# apply the indices on the sequence
slidingWindows = x(idx)

结果(为简洁而截断):

slidingWindows =
     1    11    21    31    41    51
     2    12    22    32    42    52
     3    13    23    33    43    53
    ...
    48    58    68    78    88    98
    49    59    69    79    89    99
    50    60    70    80    90   100

实际上,代码改编自信号处理工具箱中现在已弃用的SPECGRAM函数(只需执行edit specgram.m即可查看代码)。

我省略了零填充序列的部分,以防滑动窗口不能均匀地划分整个序列(例如x=1:105),但如果您需要该功能,您可以轻松地再次添加它们…

相关内容

  • 没有找到相关文章

最新更新