查找不同长度的键控向量之间的差异(在MATLAB中)

时间:2019-07-01 22:36:15

标签: matlab union

我有两个(键,值)对:

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];

我希望能找到一种有效的方法。

2 个答案:

答案 0 :(得分:2)

解决此问题的关键功能是unionismember

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)的第二个输出参数是数组ab的每个元素的索引。我们忽略的第一个输出参数,对于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.