В моем проекте мне нужна функция, которая возвращает индекс наибольшего элемента данного вектора. Так же, как max
. Для более чем одной записи с одинаковым максимальным значением (что происходит часто) функция должна выбрать одну случайным образом. В отличие от max
.
Функция является подфункцией в функциональном блоке MATLAB в Simulink. И вся модель Simulink скомпилирована.
Моя основная идея заключалась в следующем:
function ind = findOpt(vector)
index_max = find(vector == max(vector));
random = randi([1,length(index_max)],1);
ind = index_max(random);
end
Но у меня возникли проблемы со сравнением в find
и в randi
. Я узнал о безопасном сравнении здесь: Проблема с использованием функции поиска в MATLAB. Также я нашел способ заменить randi([1,imax],1)
: Реализовать 'randi' с помощью 'rand' в MATLAB< /а>.
Мой код теперь выглядит так:
function ind = findOpt(vector)
tolerance = 0.00001;
index_max = find(abs(vector - max(vector)) < tolerance);
random = ceil(length(index_max)*rand(1));
ind = index_max(random);
end
Все еще не работает. Я понимаю, что длина index_max неясна и вызывает проблемы. Но я не могу придумать никакого способа узнать это раньше. Есть идеи, как это решить?
Кроме того, я шокирован тем, что ceil
не работает, когда код выполняется?? В режиме отладки видимых изменений на входе нет.
Я думал о создании массива вроде: index_max = abs(vector - max(vector)) < tolerance;
Но не знаю, как это может помочь. Кроме того, это не решает мою проблему со случайным выбором. Надеюсь, у кого-то есть больше идей или, по крайней мере, может дать мне несколько советов!
Я использую MATLAB R2012b (32 бита) на ПК с Windows 7-64 бит с компилятором Lcc-win32 C 2.4.1.
Редактировать: Вектор обычно имеет размер 5x1 и содержит значения от -2000 до нуля, которые имеют тип double, например. vector = [-1000 -1200 -1000 -1100 -1550]'
. Но я думаю, что такая простая функция должна работать с любым входным вектором.
Вызов length(index_max)
вызывает системную ошибку в MATLAB и заставляет меня закрыть его. Думаю, это из-за странного ответа, который я получаю от find
. Для вектора со всеми одинаковыми значениями возврат из find
похож на [1.000 2.000 1.000 2.000 0.000]'
, что для меня вообще не имеет никакого смысла.
find
иrandi
, но я думаю, вы не хотите их использовать - person Autonomous   schedule 15.01.2014random = length(index_max)*rand(1)
иrandom = ceil(random)
в последовательных строках без точки с запятой. Каков результат этих двух строк? Также поместитеwhich ceil
в функцию после строки, вызывающей ceil, и также дайте нам вывод этой строки. - person user664303   schedule 15.01.2014which ceil
дает мне ошибку кодера, утверждающую: Функция «которая» не поддерживается для совместной генерации. [...]. Иceil(x)
по-прежнему возвращает x. - person FxH   schedule 15.01.2014findOpt(rand(100, 1))
, это сработает? Если это так, я предполагаю, что код, из которого вы обычно вызываетеfindOpt()
, перегружаетceil()
; надо найти где. - person user664303   schedule 16.01.2014findOpt()
в М-файле и сделал, как вы сказали. Работает отлично, даже для моей первоначальной реализации. Но все же в функциональном блоке MATLAB в Simulink это не сработает. Не думайте, что я перегружаюceil
. Может проблема в компиляторе? Завтра попробую на другом компе. Посмотрим, что там происходит... - person FxH   schedule 16.01.2014