Функция поиска Matlab выдает ошибку разницы в размерах, когда ее нет - PullRequest
0 голосов
/ 26 сентября 2018

Мой код Matlab пытается найти индексы в матрице 601 на 1, которые соответствуют заданному значению, но говорят, что левая и правая стороны имеют разное количество элементов

pH_fine = pH(1):0.01:pH(end);
pH_labvals = [7.72,9.87,7.4,7.63,7.06,6.85,8.29,9.37,11.1];
index_labvals = [];
a = find(pH_fine == 8); %This works perfectly

for i = 1:length(pH_labvals)
index_labvals(i) = find(pH_fine == pH_labvals(i)); %This throws an error
end

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Альтернативный подход заключается в использовании interp1 для поиска в таблице:

pH = [1,14]; % Not sure what values you use here, it doesn't matter for the example.
pH_fine = pH(1):0.01:pH(end);
pH_labvals = [7.72,9.87,7.4,7.63,7.06,6.85,8.29,9.37,11.1];

index_labvals = interp1(pH_fine,1:numel(pH_fine),pH_labvals,'nearest')

Здесь мы находим ближайший индекс в пределах pH_fine, который соответствует каждому из значений в pH_labvals.1:numel(pH_fine) - это индексы в pH_fine.

Обратите внимание, что цикл не нужен, поскольку interp1 будет искать все pH_labvals одновременно.

0 голосов
/ 26 сентября 2018

Ваша проблема в том, что find(pH_fine == pH_labvals(i)) в правой части иногда не находит любого соответствия и возвращает пустой результат для индекса, в частности, вектор строки 1 на 0.Это не соответствует размеру левой стороны, которая индексирует элемент 1 на 1 из вашего вектора index_labvals.

. Сначала необходимо проверить, если результат find пусто и решите, что вы будете помещать в индексный вектор в этом случае, например, 0 или NaN.Вам также нужно будет разобраться с find, что даст вам вектор индексов, если pH_labvals имеет такое же повторное значение.Если вы просто хотите удалить повторяющиеся значения, вы можете использовать unique примерно так:

pH_labvals = unique(pH_labvals, 'stable');

Если вам интересно почему вы получаетепустой результат из find, вы должны прочитать этот пост об опасностях сравнения с плавающей точкой.Одно из возможных решений, при условии, что pH_labvals содержит неповторяющиеся значения с точностью до 2 десятичных знаков, - это сначала округлить ваш pH_fine вектор до 2 десятичных знаков:

pH_fine = round(pH(1):0.01:pH(end), 2);

Этодолжно позволить вам избежать ошибок сравнения с плавающей точкой.

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