Look up a value in an incomplete list

조회 수: 2 (최근 30일)
clauper
clauper 2022년 2월 21일
댓글: DGM 2022년 2월 21일
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에서 MATLAB에 대해 자세히 알아보기

제품


릴리스

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by