Matlab重采样向量

时间:2015-03-11 16:31:21

标签: arrays matlab vector

我目前正在尝试寻找一种重新采样矢量的方法。因此,例如,如果我有一个大小为4 [1 3 5 7]的向量,并且我想将其缩小到大小3,它会给我[1 4 8]或类似的东西。扩大但相反的方式相同。

我搜索过并发现函数 Interp Decimate ,这实际上是这样做的,但问题是我没有整数放大或缩小因子。我有大小为140到160的向量,我希望它们的大小都是150.这不能用 Interp Decimate 来完成,因为它们只适用于整数因子。

所以我想知道,有没有什么快速的方法可以做到这一点,还是我真的想要一个聪明的方法来做这个重塑?

提前致谢

3 个答案:

答案 0 :(得分:4)

如果我正确理解您的问题,您希望重新取样数据向量。你可以做的是在MATLAB中使用interp1,但是你要指定从你想要采样到结束的点的范围,并且这个范围内的点数是你的总点数。期望的输出。

要完成您想要的操作,请使用linspace。此外,您可以使用要重新取样的数组作为输出y值,并使用虚拟 x值为您尝试重新采样的数组中的每个值定义。像x = [1 2 ... ]这样的简单元素和你的向量中的元素一样多。

使用您的小例子,请执行以下操作:

a = [1 3 5 7];
x = 1 : numel(a);
xp = linspace(x(1), x(end), 3); %// Specify 3 output points
y = interp1(x, a, xp)

y =

     1     4     7

因此,针对您的具体情况,请更改代码的第三行,以便将3更改为150。定义a取决于您,但第二行代码和最后一行代码应该保持不变。

上述方法的优点是不假设数据向量增加或减少。事实上,它可以是随机的。应该发生的是,您的数据(存储在a)将根据您所需的点数进行重新采样。

答案 1 :(得分:3)

如果您有图像处理工具箱,我会使用

new_vector = imresize(old_vector, ratio);

修改

我刚注意到一个实际问题。如果比率> 1结果不再是矢量而是矩阵。它很容易解决,因为每一行都是相同的(如果比率< = 1,这也可以使用,因此它也可以使用)

new_vector = imresize(old_vector, ratio);
new_vector = new_vector(1,:);

或更优雅(功劳归于2cents)

new_vector  = imresize(old_vector , [desired_num_rows desired_num_cols])

答案 2 :(得分:1)

您可以使用linspace创建具有固定数量元素的线性间距矢量。

在您的情况下,我会选择基于linspace的函数句柄来执行此操作:

% --- Define the function handle
fun = @(A, n) linspace(min(A), max(A), n);

% --- Demo
A = 1:2:280;       % A has 140 elements
B = fun(A, 150);   % B has now 150 elements, with the same min and max

最佳,