我目前正在尝试寻找一种重新采样矢量的方法。因此,例如,如果我有一个大小为4 [1 3 5 7]
的向量,并且我想将其缩小到大小3,它会给我[1 4 8]
或类似的东西。扩大但相反的方式相同。
我搜索过并发现函数 Interp 和 Decimate ,这实际上是这样做的,但问题是我没有整数放大或缩小因子。我有大小为140到160的向量,我希望它们的大小都是150.这不能用 Interp 或 Decimate 来完成,因为它们只适用于整数因子。
所以我想知道,有没有什么快速的方法可以做到这一点,还是我真的想要一个聪明的方法来做这个重塑?
提前致谢
答案 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
最佳,