matlab - Matlab 基于第二个数组重新采样数组

假设我有两个数据集,都由 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_2 的元素将 y_1 的元素与相同的 x、value 进行比较:

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

然后,我怎样才能找到第二个数组,该数组仅包含 y_2 的 values 和对应的 x_2 value,该数组以有效的方式出现在 x_1 中?

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

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

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

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

回答1

您可以使用 https://www.mathworks.com/help/matlab/ref/double.ismember.html 对其进行矢量化:

[Lia,Locb] = ismember(x_1, x_2);

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

应不应该是另一个问题。在 MATLAB 中避免循环在很大程度上是一种过时的策略,因为 MATLAB 开始引入 JIT 编译引擎。我怀疑矢量化版本会比 for 循环快,除了可能是最大的数据集,而且我不相信它更具可读性。 YMMV

回答2

类似于以前的答案,但更短:

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

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

相似文章

随机推荐

最新文章