Matlab 重采样向量
Matlab resampling vectors
我目前正在尝试找到一种对向量重新采样的方法。因此,例如,如果我有一个大小为 4 [1 3 5 7]
的向量,并且我想将其缩小到大小 3,它会给我 [1 4 8]
或类似的东西。相同的扩大,但以相反的方式。
我已经搜索并找到函数 Interp 和 Decimate,它们实际上是这样做的,但问题是我没有有一个整数放大或缩小因子。我有大小为 140 到 160 的向量,我希望它们的大小都是 150。这不能用 Interp 或 Decimate 来完成,因为它们只适用于整数因子。
所以我想知道,是否有任何快速的方法可以做到这一点,或者我是否真的必须想出一个聪明的方法来进行这种重塑?
提前致谢
您可以使用 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
最佳,
如果我对您的问题的理解正确,您想要重新采样 一个数据向量。你可以做的是在MATLAB中使用interp1
,但是你指定了从你想要采样的地方开始到结束的点的范围,这个范围内的点数就是你的总点数所需的输出。
要完成您想要的,请使用 linspace
。此外,您将使用要重新采样的数组作为 output 或 y
值,并且您将使用 dummy 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
中)将根据您想要的点数重新采样。
如果你有图像处理工具箱我会用
new_vector = imresize(old_vector, ratio);
编辑
我刚刚注意到一个实际问题。如果比率 > 1,则结果不再是向量而是矩阵。它很容易解决,因为每一行都是相同的(如果比率 <=1 这也有效,所以它总是可以安全使用)
new_vector = imresize(old_vector, ratio);
new_vector = new_vector(1,:);
或更优雅一点(积分为 2 美分)
new_vector = imresize(old_vector , [desired_num_rows desired_num_cols])
我目前正在尝试找到一种对向量重新采样的方法。因此,例如,如果我有一个大小为 4 [1 3 5 7]
的向量,并且我想将其缩小到大小 3,它会给我 [1 4 8]
或类似的东西。相同的扩大,但以相反的方式。
我已经搜索并找到函数 Interp 和 Decimate,它们实际上是这样做的,但问题是我没有有一个整数放大或缩小因子。我有大小为 140 到 160 的向量,我希望它们的大小都是 150。这不能用 Interp 或 Decimate 来完成,因为它们只适用于整数因子。
所以我想知道,是否有任何快速的方法可以做到这一点,或者我是否真的必须想出一个聪明的方法来进行这种重塑?
提前致谢
您可以使用 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
最佳,
如果我对您的问题的理解正确,您想要重新采样 一个数据向量。你可以做的是在MATLAB中使用interp1
,但是你指定了从你想要采样的地方开始到结束的点的范围,这个范围内的点数就是你的总点数所需的输出。
要完成您想要的,请使用 linspace
。此外,您将使用要重新采样的数组作为 output 或 y
值,并且您将使用 dummy 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
中)将根据您想要的点数重新采样。
如果你有图像处理工具箱我会用
new_vector = imresize(old_vector, ratio);
编辑
我刚刚注意到一个实际问题。如果比率 > 1,则结果不再是向量而是矩阵。它很容易解决,因为每一行都是相同的(如果比率 <=1 这也有效,所以它总是可以安全使用)
new_vector = imresize(old_vector, ratio);
new_vector = new_vector(1,:);
或更优雅一点(积分为 2 美分)
new_vector = imresize(old_vector , [desired_num_rows desired_num_cols])