Как найти индекс значения, в котором сходятся элементы вектора?

Скажем, у меня есть вектор:

A = [1.444, 1.425, 1.435, 1.438, 1.438, 1.436, 1.436, 1.436, 1.436, 1.436];

Как видно, этот вектор A стабилизируется или сходится в точке 1.436. Как я могу найти индекс этого значения, например 1.436 в MATLAB?

Изменить:

Еще примеры:

B = [1 2 1 4 2 5 6 2 ???? 5 5 5 5 5 5 5 5 5 5]
C = [224.424 224.455 224.454 224.456 224.456 224.452 224.451 224.456 ????????????.???????????? 224.454 224.454 224.454 224.454 224.454 224.454]

Таким образом, результат, который я хочу, - это индекс, когда элементы в векторах больше не меняются. Скажем, например, что значения в векторах взяты в момент времени t. Таким образом, для первого вектора этот индекс будет иметь индекс 9, когда элементы останутся постоянными на уровне 5.
То же самое и с вектором C. Искомым выходом здесь является индекс 9, когда элементы постоянны в 224.454.


person Lamar    schedule 04.12.2018    source источник
comment
Если нужно что-то более сложное, чем просто последний элемент (т.е. A(end)), то нет, мы не получим картину. Вы должны четко, математически определить, чего вы хотите достичь. Как вы измеряете конвергенцию? Всегда ли он будет в конце массива? Является ли это частью итеративного процесса или просто захватом значения из массива? Измените свой вопрос, чтобы сделать его более понятным.   -  person Wolfie    schedule 04.12.2018
comment
Если бы у вас были соответствующие значения оси x, вы могли бы посмотреть на градиент кривой и найти, когда его абсолютное значение падает ниже определенного порога (который необходимо определить).   -  person am304    schedule 04.12.2018
comment
Это худшая конвергенция, которую я видел за долгое время! Я имею в виду, что первое значение ближе, чем второе, а третье значение ближе, чем четвертое и пятое значения. Откуда у вас это?   -  person Nicky Mattsson    schedule 04.12.2018
comment
@NickyMattsson система пружинно-демпферной выборки с очень низким временным разрешением?   -  person rinkert    schedule 04.12.2018
comment
Вы можете использовать diffнекоторым допуском или вы можете спросить Почему 24.0000 не равно 24.0000 в MATLAB?)   -  person Sardar Usama    schedule 04.12.2018


Ответы (1)


В соответствии с вашим редактированием предположим, что вектор всегда будет сходиться, а сходящимся значением будет последний элемент (A(end)). Кроме того, предположим, что при сходимости значения равны последнему элементу.

Идея состоит в том, чтобы сначала найти индекс последнего элемента, который не равен последнему элементу. Тогда индекс + 1 — это индекс первого сходящегося элемента, т. е. find(A~=A(end),1,'last') + 1

Пример 1:

A = [1.444, 1.425, 1.435, 1.438, 1.438, 1.436, 1.436, 1.436, 1.436, 1.436];
index = find(A~=A(end),1,'last') + 1

Выход:

index =

     6

Пример 2

B = [1 2 1 4 2 5 6 2 5 5 5 5 5 5 5 5 5 5 5];
index = find(B~=B(end),1,'last') + 1

Выход:

index =

     9

Пример 3

C = [224.424 224.455 224.454 224.456 224.456 224.452 224.451 224.456 224.454 224.454 224.454 224.454 224.454 224.454 224.454];
index = find(C~=C(end),1,'last') + 1

Выход:

index =

     9

Обновление:

Поскольку вы имеете дело со сходимостью, лучше указать допуск на сходимость. Например:

tolerance = 1e-5;

A = [1.444, 1.425, 1.435, 1.438, 1.438, 1.436, 1.436, 1.436, 1.436, 1.436];
index = find(abs(A - A(end)) >= tolerance,1,'last') + 1

Выход:

index =

     6
person Banghua Zhao    schedule 05.12.2018
comment
Хороший ответ, но было бы лучше ">с допуском. - person Cris Luengo; 05.12.2018
comment
@CrisLuengo Спасибо! Ты прав. В настоящее время в вопросе не указан допуск, поэтому я предполагаю, что сходящееся значение равно последнему элементу. - person Banghua Zhao; 05.12.2018