Look up a value in an incomplete list

1 次查看(过去 30 天)
I have keys and values like this:
keys = ["a", "b", "c", "d"];
vals = [3,4,2,1];
and I need to look up the values for x, but not all keys exist, e.g.:
x = ["c", "d", "e"];
which should result in:
y = [2, 1, NaN];
The problem I have is that strfind(), matches() yield empty arrays for "e", which leads to errors when looking up in vals.
Also, all arrays are >100k so I would like to avoid a for-loop.

采纳的回答

Stephen23
Stephen23 2022-2-21
编辑:Stephen23 2022-2-21
Simpler and more efficient:
keys = ["a","b","c","d"];
vals = [3,4,2,1];
x = ["c","d","e"];
[idx,idy] = ismember(x,keys);
out = nan(size(x));
out(idx) = vals(idy(idx))
out = 1×3
2 1 NaN

更多回答(2 个)

DGM
DGM 2022-2-21
How about:
keys = ["a", "b", "c", "d"];
vals = [1,2,3,4];
x = ["c", "d", "e"];
[~,y] = ismember(x,keys);
y(y==0) = NaN
y = 1×3
3 4 NaN
  2 个评论
clauper
clauper 2022-2-21
编辑:clauper 2022-2-21
This looks promising. However, I need the values in vals, not the indices. I changed vals in the question such that the two can be distinguished.
DGM
DGM 2022-2-21
Oof. I forgot about that.
keys = ["a", "b", "c", "d"];
vals = [11,22,33,44];
x = ["c", "d", "e"];
[m idx] = ismember(x,keys);
y = NaN(size(m));
y(m) = vals(idx(m))
y = 1×3
33 44 NaN

请先登录,再进行评论。


clauper
clauper 2022-2-21
I figured it out:
keys = ["a", "b", "c", "d"];
vals = [3,4,2,1];
x = ["c", "d", "e"];
[~, idx] = ismember(x, keys);
keyExists = matches(x, keys);
y = nan(length(x),1);
y(keyExists) = vals(idx(idx~=0))
y = 3×1
2 1 NaN
I don't know if there is a more efficient way but this works.

类别

Help CenterFile Exchange 中查找有关 Operators and Elementary Operations 的更多信息

产品


版本

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by