Найти ближайшее значение в каждой группе в столбце матрицы - PullRequest
0 голосов
/ 18 марта 2019

Это еще одна операция, основанная на тех же матричных данных, о которых я говорил в предыдущем вопросе.У меня есть матрица, как показано ниже.

a = [1.05 2.1 3.4 1; 1.06 2.2 3.6 1; 2.04 2.3 3.8 2; 2.15 2.2 4.0 2; 1.37 2.3 3.7 1;3.12 2.1 4.1 3;3.02 2.2 4.2 3;3.42 2.3 4.5 3;3.24 2.4 4.8 3]

a =

1.0500    2.1000    3.4000    1.0000
1.0600    2.2000    3.6000    1.0000
2.0400    2.3000    3.8000    2.0000
2.1500    2.2000    4.0000    2.0000
1.3700    2.3000    3.7000    1.0000
3.1200    2.1000    4.1000    3.0000
3.0200    2.2000    4.2000    3.0000
3.4200    2.3000    4.5000    3.0000
3.2400    2.4000    4.8000    3.0000

a (:, 4) это номера групп.Основываясь на номерах групп, я разбил матричные данные на 3 группы: 1, 2 и 3.

Я хотел бы найти индекс значения, ближайший к 2,2, в (:, 2) в каждойгруппа .Из данных, которые вы видите, 2.2 в строке 2 принадлежит группе 1, 2.2 в строке 4 принадлежит группе 2, а 2.2 в строке 7 принадлежит группе 3.

Показан мой кодкак показано ниже:

[minValue,closestIndex] = splitapply(@(x)min(abs(2.2-x)), a(:,2), findgroups(a(:,4)))

Результат:

minValue =

 0
 0
 0

Это согласуется, как мы можем найти из данных.

closestIndex =

 2
 2
 2

Предполагается, что это индексы трех 2,2 в матрице, которые должны быть 2, 4 и 7. Но результат равен 2, 2 и 2.

Что такоене так с моим кодом?

Как решить эту проблему?

1 Ответ

1 голос
/ 18 марта 2019

Я думаю, вы неправильно понимаете, как работает эта функция.Он разделил вашу первоначальную настройку:

a =

1.0500    2.1000    3.4000    1.0000
1.0600    2.2000    3.6000    1.0000
2.0400    2.3000    3.8000    2.0000
2.1500    2.2000    4.0000    2.0000
1.3700    2.3000    3.7000    1.0000
3.1200    2.1000    4.1000    3.0000
3.0200    2.2000    4.2000    3.0000
3.4200    2.3000    4.5000    3.0000
3.2400    2.4000    4.8000    3.0000

на

x1=
1.0500    2.1000    3.4000    1.0000
1.0600    2.2000    3.6000    1.0000 (index = 2)
1.3700    2.3000    3.7000    1.0000
x2=
2.0400    2.3000    3.8000    2.0000
2.1500    2.2000    4.0000    2.0000 (index = 2)
x3=
3.1200    2.1000    4.1000    3.0000
3.0200    2.2000    4.2000    3.0000 (index = 2)
3.4200    2.3000    4.5000    3.0000
3.2400    2.4000    4.8000    3.0000

Индексы рассматриваются отдельно, поэтому действительно - 2,2,2 является правильным ответом на этот запрос.Согласно документации «Функция splitapply вызывает func один раз на группу», поэтому нет простой возможности получить индексы из исходной матрицы напрямую.Может быть, вы можете обойти это, добавив еще один столбец, такой как 1 2 3 4 5 6 7 8 9, и сохранить число из него или что-то в этом роде, но это не так элегантно и потребует довольно сложных func.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...