八度音程中移动窗口movfun的大小有什么问题?

问题描述

我正在尝试在八度音阶中使用 movfun(移动窗口)

x = -1000:0.1:1000
y = sin(x)
movfun(@(arg) printf("%d\n",size(arg)),y(1:100),4)

我希望看到所有 4s

然而,令人惊讶的是(对我而言)我得到:

4
1
4
97
2
1
3
1
3
1
ans =

 Columns 1 through 29:

   4   4   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5

 Columns 30 through 58:

   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5

 Columns 59 through 87:

   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5   5

 Columns 88 through 100:

   5   5   5   5   5   5   5   5   5   5   5   5   4

我的期望有什么问题?

解决方法

这会发出更多光线(为了更清晰,我已将窗口大小增加到 8):

movfun( @(x) size(x,1),y(1:100),8 )
movfun( @(x) size(x,2),8 )

它们分别产生以下输出:

4   5   6   7   8   8   8   8   [...]  8   8   8   8   7   6   5
1   1   1   1   93  93  93  93  [...]  93  93  93  93  1   1   1

这告诉我们,大概在幕后,movfun 确保以垂直形式传递每个 8 元素向量以进行处理,并且它将边缘特别视为单个输入,然后抓取所有“非边缘”元素并同时执行某种形式的矢量化计算,涉及所有 93 列。

我们可以从文档中确认“边缘”行为:

“端点”

该属性控制结果的计算方式 窗口的边界(端点)。可能的值为:

“收缩”(默认)
窗口在数组的开头和结尾被截断以排除没有源数据的元素。例如,对于长度为 3 的窗口,'Y(1) = FCN (X(1:2))',并且 'Y(end) = FCN (X(end-1:end))'。