Как вычесть значение в матрице, которое соответствует условию матрицы? - PullRequest
0 голосов
/ 28 декабря 2018

Как получить матрицу Md из матрицы M, соответствующую следующим условиям:

, если M:

M=[0.000000 1188.000000 340.216815
0.000000    1186.437500 570.718050
0.000000    1183.312500 769.256473
6.500000    1188.500000 331.115127
6.500000    1186.963013 510.419428
6.500000    1183.889160 719.346166
13.000000   1189.000000 325.858265
13.000000   1187.488647 426.599681
13.000000   1184.465942 671.896040
19.500000   1189.000000 330.567837
19.500000   1187.529785 383.856624
19.500000   1184.589478 643.279493
26.000000   1190.000000 333.606362
26.000000   1188.539795 381.784469
26.000000   1185.619263 648.680568];

Найти максимальное значение M(:,2), где M(:,1) равно (0, 6,5 .. 26) это:

for i=0:6.5:26
ind = M(:,1) == i;
max(M(ind,2))
end

получение

ans = 1188
ans = 1188.5
ans = 1189
ans = 1189
ans = 1190

Идея состоит в том, чтобы использовать эти максимальные значения, чтобы вычесть их издругие значения в M(:,2), где M(:,1) равно (0, 6,5 .. 26).Например: максимальное значение в M(:,2), где M(:,1)=0 равно 1188, тогда мы вычли бы из 1188: 1188, 1186.437500 и 1183.312500, которые являются значениями столбца M(:,2), соответствующими M(:,1)=0.

* 1024.*

Затем сделайте то же самое для 6.5, 13..26.Результат будет:

Md=[0.000000    0.0000  340.216815
0.000000    1.5625  570.718050
0.000000    4.6875  769.256473
6.500000    0.0000  331.115127
6.500000    1.5370  510.419428
6.500000    4.6108  719.346166
13.000000   0.0000  325.858265
13.000000   1.5114  426.599681
13.000000   4.5341  671.896040
19.500000   0.0000  330.567837
19.500000   1.4702  383.856624
19.500000   4.4105  643.279493
26.000000   0.0000  333.606362
26.000000   1.4602  381.784469
26.000000   4.3807  648.680568];

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы почти там:

for i=0:6.5:26
   ind = M(:,1) == i;
   m = max(M(ind,2));
   M(ind,2) = m - M(ind,2);
end

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

Здесь мы модифицируем M вместо создания новой матрицыMd, это можно исправить, начав с копии матрицы.

Могут быть способы сделать это, не используя цикл, но если это не окажется узким местом в вашем коде, сохраняйтеэто просто и читабельно!

0 голосов
/ 28 декабря 2018

Решением может быть использование группировки первого столбца для вычисления max для каждой группы:

maxs = accumarray(M(:,1), M(:,2), [], @max);

Кроме того, поскольку сравнение двух чисел с плавающей точкой с == может быть ошибочным, лучше использовать этот метод .

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