Look up a value in an incomplete list

2 Ansichten (letzte 30 Tage)
clauper
clauper am 21 Feb. 2022
Kommentiert: DGM am 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.

Akzeptierte Antwort

Stephen23
Stephen23 am 21 Feb. 2022
Bearbeitet: Stephen23 am 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

Weitere Antworten (2)

DGM
DGM am 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 Kommentare
clauper
clauper am 21 Feb. 2022
Bearbeitet: clauper am 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 am 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

Melden Sie sich an, um zu kommentieren.


clauper
clauper am 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.

Kategorien

Mehr zu MATLAB finden Sie in Help Center und File Exchange

Produkte


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by