如何解决八度音程中移动窗口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))'。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。