Look up a value in an incomplete list

1 visualizzazione (ultimi 30 giorni)
clauper
clauper il 21 Feb 2022
Commentato: DGM il 21 Feb 2022
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.

Risposta accettata

Stephen23
Stephen23 il 21 Feb 2022
Modificato: Stephen23 il 21 Feb 2022
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

Più risposte (2)

DGM
DGM il 21 Feb 2022
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 Commenti
clauper
clauper il 21 Feb 2022
Modificato: clauper il 21 Feb 2022
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 il 21 Feb 2022
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

Accedi per commentare.


clauper
clauper il 21 Feb 2022
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.

Categorie

Scopri di più su MATLAB in Help Center e File Exchange

Prodotti


Release

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by