Нахождение разницы между ключевыми векторами разной длины (в Matlab) - PullRequest
0 голосов
/ 02 июля 2019

У меня есть две пары (ключ, значение):

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)Вот этот новый ключ:

val_result = [0 3 -3 1 -8 2 0];

Буду признателен за эффективный способ сделать это.

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Основные функции для решения этой проблемы: union и ismember:

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 выше.

0 голосов
/ 02 июля 2019

Я предлагаю использовать 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...