在我的項目中,我需要一個函數,它返回給定矢量的最大元素的索引。就像max
。對於具有相同最大值(經常出現)的多個條目,函數應該隨機選擇一個條目。不像max
。用於查找矢量中具有相同最大值的條目的函數
該函數是Simulink中MATLAB函數塊的子函數。整個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
。 我在這裏找到安全的比較:Problem using the find function in MATLAB。我還發現了一種替代randi([1,imax],1)
:Implement 'randi' using 'rand' in 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;
但不知道如何可以幫助。此外,它不能解決我隨機選擇的問題。 希望有人有更多的想法,或者至少可以給我一些提示!
我在Windows7-64bit PC上使用MATLAB R2012b(32位),使用Lcc-win32 C 2.4.1編譯器。
編輯: 矢量通常大小爲5x1,並且包含-2000和0之間的值,其類型是雙倍的,例如, vector = [-1000 -1200 -1000 -1100 -1550]'
。但我認爲這樣一個簡單的函數應該適用於任何類型的輸入向量。
length(index_max)
的調用導致MATLAB中的系統錯誤,迫使我關閉它。我想這是由於我從find
得到的奇怪回報。對於所有相同值的矢量,find
的返回類似[1.000 2.000 1.000 2.000 0.000]'
,這對我來說根本沒有任何意義。
什麼不行?在matlab中試過你的代碼,看起來好嗎? – stijn
在MATLAB中它也適用於我。但是運行Simulink模型會導致運行時錯誤,並說:「預期爲一個整數值,發現非整數變量隨機,值爲4.07362。「對於行:IND = index_max(隨機); – FxH
嗯這是有趣的.. – stijn