基于第二个数组的Matlab重采样数组

Matlab resample array based on second array

假设我有两个数据集,均由 xy 数组组成,例如:

x_1 = [1 2 3 4 5 6 7 8 9 10];
y_1 = [8 12 20 3 4 9 10 55 3 2];

x_2 = [2 5 6 8 9];
y_2 = [4 18 3 12 1];

现在,我想计算一个新指标 z = y_1 ./ y_2,但我想将 y_1 的元素与 y_2 的元素与相同的 x 进行比较,值:

z = [12 4 9 55 3 2] ./ [4 18 3 12 1]

然后我如何找到仅包含 y_2 值的第二个数组以及 x_1 中出现的相应 x_2 值的有效方式?

到目前为止,我想出了这个解决方案,但我怀疑它是否是最有效的可能性:

for i = 1:numel(x_2)
    z(i) = y_2(i) / y_1(y_1 == x_2(i));
end

由于在 Matlab 中通常可以避免元素循环,我认为有更好的方法可以做到这一点。

所以基本上,我想对第二个数据集重新采样,使其 x_2 数组等于 x_1

可以 使用 ismember:

对其进行矢量化
[Lia,Locb] = ismember(x_1, x_2);

z = y_1(Lia) ./ y_2(nonzeros(Locb).');

你是否应该是另一个问题。自从 MATLAB 开始引入 JIT 编译引擎以来,在 MATLAB 中避免循环在很大程度上是一种过时的策略。我怀疑矢量化版本是否会比 for-loop 更快,除了 maybe 对于最大的数据集,我不认为它更具可读性。 YMMV

与之前的答案类似,但更短:

y_1(ismember(x_1,x_2))./y_2

注意:我已经在 Octave 上检查过了,因为没有 Matlab 许可证。