我有一个向量,我想在MATLAB中“填充”它,这样得到的向量是长度的两倍,额外的数据是原始相邻值的平均值。
例如
a = [1:10]
b
= a
的函数,其中b
现在大小为20
b = 0.5 1 1.5 2 2.5 3 3.5....... 9.5 10
答案 0 :(得分:4)
您可以使用插值在一行中执行此操作(请注意,第一个数字是NaN,因为它确实没有定义):
interp1(2:2:length(a)*2, a, 1:length(a)*2)
我们的想法是均匀分布x
个值(即2,4,6 ......),以便您可以使用单个xi
个值{(1,2,3,4)。因此,它们正好在每个x
值之间。然后y点的线性插值将是它们的手段。如果你不喜欢我留在前面的那个NaN,主要是为了说明它是未定义的,你可以使用'extrap'
中的interp1
标志,或者(更好的imo)启动你的{{ 1}}来自xi
:
2
或
interp1(2:2:length(a)*2, a, 1:length(a)*2, 'linear', 'extrap')
否则这是一个简单的矢量化方法:
interp1(2:2:length(a)*2, a, 2:length(a)*2)
答案 1 :(得分:2)
最简单的方法是使用linspace
指定您希望使用interp1
进行插值(和推断)的位置:
>> a = 1:10;
>> b = interp1(a,linspace(0.5,numel(a),2*numel(a)),'linear','extrap')
b =
Columns 1 through 8
0.5000 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000
Columns 9 through 16
4.5000 5.0000 5.5000 6.0000 6.5000 7.0000 7.5000 8.0000
Columns 17 through 20
8.5000 9.0000 9.5000 10.0000
使用'linear'
作为方法可以得到相邻值的平均值,'extrap'
表示执行外推(因此b(1)
不会出现NaN
,而是0.5)。
答案 2 :(得分:1)
看起来你正在假设" zeroth" entry为零,以便获得与原始向量的长度相同的均值。你可以使用
a2 = filter([0.5,0.5],1,a);
获取均值向量,其中第一个条目的平均值为0,第一个条目为a。然后,你可以做任何你喜欢的事情来交错这两个向量,例如,
b = zeros(2*max(size(a)),1);
b(1:2:end) = a2;
b(2:2:end) = a;
filter是一个很棒的命令,尤其适用于计算原始数据向量上的离散卷积(您的相邻方法是一个非常简单的卷积示例)。它也可以逐行或逐列地处理矩阵。