我有两个(键,值)对:
key_1 = {'a','b','c','d'};
val_1 = [1 2 5 -1];
key_2 = {'a','c','b','e','f','g'};
val_2 = [1 2 5 -8 2 0];
我想找到一个结果值,该值在保留键的顺序的同时保留了两个值之间的元素差异。此外,如果键不存在于1或2中,则该值可以为零。
首先找到两个键的并集(以某种排序的顺序)可能很有意义:
key_result = {'a','b','c','d','e','f','g'};
然后,得到的元素方向的差异(即value_2 - value_1
)w.r.t。该新密钥为:
val_result = [0 3 -3 1 -8 2 0];
我希望能找到一种有效的方法。
答案 0 :(得分:2)
key_1 = {'a','b','c','d'};
val_1 = [1 2 5 -1];
key_2 = {'a','c','b','e','f','g'};
val_2 = [1 2 5 -8 2 0];
% These are all the keys, in alphabetical order
keys = union(key_1, key_2)
% This array will be filled with the difference
val_diff = zeros(size(keys));
% Step 1: add the values of set 1
[~,ii] = ismember(key_1,keys);
val_diff(ii) = val_1;
% Step 2: subtract the values of set 2
[~,ii] = ismember(key_2,keys);
val_diff(ii) = val_diff(ii) - val_2;
ismember(a,b)
的第二个输出参数是数组a
中b
的每个元素的索引。我们忽略的第一个输出参数,对于a
的每个成员来说都是真实的,因为我们是如何构建上面的b
的。
答案 1 :(得分:0)
我建议使用accumarray
。这个想法是在要减去的值前面加上accumarray
并加上减号。如果您的密钥是整数,则可以直接应用
key_1 = 1:4;
val_1 = [1 2 5 -1];
key_2 = [1,3,2,5,6,7];
val_2 = [1 2 5 -8 2 0];
val_diff = accumarray([key_1,key_2],[-val_1,val_2]) %note the minus in front of val_1
但是,由于不是,我们首先必须将其转换为整数,例如完成
key = {'a','b','c','d'};
nkey = cellfun(@(x)x-96,key) %The ascii number of a = 97, b=98 etc.