Как найти индекс максимального значения в массиве?
Допустим, у нас есть массив с именем 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.
@csg, 👍2
Обсуждение4 ответа
Лучший ответ:
Во-первых, вам действительно нужны значения 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
Форум Arduino обсуждал поиск индекса, когда вы знаете, какой индекс значения вам нужен. Решение было найдено путем обхода массива по значению, которое вы искали.
Для вашего требования вам придется
(1) сначала найдите maxValue, а затем
(2) найдите позицию (индекс) этого maxValue, используя код, который они обсуждали здесь:
https://forum.arduino.cc/index.php?topic=121116.0
То есть, два прохода по массиву, чтобы получить максимальный индекс? Хм..., @frarugi87
Код, предоставленный Якубом Крначем, получает небольшое изменение, которое даст индекс максимального значения. Вот измененный код:
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
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.
- Работает ли конструкция int array[100] = {0} на Arduino?
- Длина константного массива uint8_t*
- Как удалить элемент из массива arduino?
- Как вернуть значение массива символов в функции Arduino IDE?
- Есть ли ограничения на размер массива в Arduino Mega 2560?
- Чтение из SPIFFS - Как лучше всего работать со строковым (или char) массивом с неопределенной длиной?
- Чтение изображений bmp с SD-карты, преобразование их и отображение на последовательном мониторе в Arduino
- Как установить текущее положение двигателя постоянного тока равным нулю + сохранить текущие позиции в массиве и запустить его?
В библиотеках Arduino нет специальной функции для поиска элемента в массиве., @Juraj
Дубликат https://stackoverflow.com/a/2953498/5296568, @Maximilian Gerhardt
У меня есть библиотека Average, которая делает все это для вас. Вот как она находит индекс максимального значения: https://github.com/MajenkoLibraries/Average/blob/master/Average.h#L194, @Majenko