Как найти индекс максимального значения в массиве?

Допустим, у нас есть массив с именем myMeasurements

int myMeasurements[9]={3,4,8,12,7,2,1,67,8};

Как найти индекс максимального элемента этого массива?

Например, код MATLAB будет выглядеть так:

myMeasurements = [3,4,8,12,7,2,1,67,8];
[maxValue,Index] = max(myMeasurements);

где maxValue возвращается как 67, тогда как Index возвращается как 8.

Для справки: я использую Teensy 3.2 и программирую его с помощью Arduino IDE, используя дополнение Teensyduino.

, 👍2

Обсуждение

В библиотеках Arduino нет специальной функции для поиска элемента в массиве., @Juraj

Дубликат https://stackoverflow.com/a/2953498/5296568, @Maximilian Gerhardt

У меня есть библиотека Average, которая делает все это для вас. Вот как она находит индекс максимального значения: https://github.com/MajenkoLibraries/Average/blob/master/Average.h#L194, @Majenko


4 ответа


Лучший ответ:

3

Во-первых, вам действительно нужны значения int для измерений или нет? Если нет, и у вас есть числа от 0 до 255, переключите значения в byte, ваш микроконтроллер скажет вам спасибо.

Затем есть проблема с другими ответами, которая заключается в том, что... Переменные нельзя оставлять неинициализированными!!! Вы можете использовать этот код, чтобы получить необходимую вам информацию:

(Я также поместил размер myMeasurements в константную переменную. Позже вы сможете поблагодарить меня за это)

const byte maxMeasurements = 9;
int myMeasurements[maxMeasurements ]={3,4,8,12,7,2,1,67,8};

byte maxIndex = 0;
int maxValue = myMeasurements[maxIndex];

for(byte i = 1; i < maxMeasurements; i++)
{
    if(myMeasurements[i] > maxValue) {
        maxValue = myMeasurements[i];
        maxIndex = i;
    }
}
,

Содержимое массива myMeasurements поступает из АЦП (analogRead) и, следовательно, составляет 10 бит (0-1023). Если не используется функция map, их нельзя объявить как byte. Я воздержался от этого, поскольку функция map снижает разрешение, и вполне вероятно, что значения, хранящиеся в массиве myMeasurements, близки друг к другу, т. е. разрешение играет важную роль при поиске максимального элемента. Я могу определить его как unsigned int вместо int., @csg

На самом деле я собираюсь использовать команду analogReadResolution(16), чтобы увеличить точность АЦП до 16 бит, что также поддерживается типом данных unsigned int., @csg

@canberk_gurel вам не нужна map (которая медленная), вы можете просто сделать что-то вроде (uint8_t)(readAnalog(channel) >> 4) (я не помню функцию, так что простите, если readAnalog не верна). В любом случае да, если вам нужно измерение более 8 бит, вам нужна переменная более 8 бит, и поэтому uint16_t идеально подходит, @frarugi87


-1

Форум Arduino обсуждал поиск индекса, когда вы знаете, какой индекс значения вам нужен. Решение было найдено путем обхода массива по значению, которое вы искали.
Для вашего требования вам придется
(1) сначала найдите maxValue, а затем
(2) найдите позицию (индекс) этого maxValue, используя код, который они обсуждали здесь: https://forum.arduino.cc/index.php?topic=121116.0

,

То есть, два прохода по массиву, чтобы получить максимальный индекс? Хм..., @frarugi87


-1

Код, предоставленный Якубом Крначем, получает небольшое изменение, которое даст индекс максимального значения. Вот измененный код:

int myMeasurements[9]={3,4,8,12,7,2,1,67,8};
int max,current, maxI; 
for(int i = 0;i < 9;i++){
    current = myMeasurements[i];
    if(current > max){
        max = current;
        maxI = i;
    }
}
,

Ох, уж эти чудесные неинициализированные переменные..., @frarugi87


0
int myMeasurements[9] = {3,4,8,12,7,2,1,67,8};
int maxI = 0;
for(int i = 1;i < 9;i++) 
    if(myMeasurements[i] > myMeasurements[maxI])
       maxI = i;
,

Поставьте >= для последнего найденного максимума, @A. L. K.

Опередили на несколько секунд... Хотя бы небольшое объяснение, почему этот ответ лучше предыдущих, не повредило бы..., @frarugi87

Вы не используете переменную для текущего числа, вы не используете переменную для максимального значения, только для максимального индекса. Вы можете присвоить 0 maxI перед циклом for и пропустить 1 итерацию, так что это немного быстрее и занимает меньше памяти., @A. L. K.