2014-01-15 46 views
1

在我的項目中,我需要一個函數,它返回給定矢量的最大元素的索引。就像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 

但我得到的比較問題findrandi。 我在這裏找到安全的比較: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]',這對我來說根本沒有任何意義。

+1

什麼不行?在matlab中試過你的代碼,看起來好嗎? – stijn

+1

在MATLAB中它也適用於我。但是運行Simulink模型會導致運行時錯誤,並說:「預期爲一個整數值,發現非整數變量隨機,值爲4.07362。「對於行:IND = index_max(隨機); – FxH

+0

嗯這是有趣的.. – stijn

回答

0
function v= findOpt(v) 
if isempty(v) 
    return; 
end 
v = find((max(v) - v) < 0.00001); 
v = v(ceil(rand(1)*end)); 
end 
+0

嘗試過它,但仍然得到「ceil(rand(1)* end)的運行時錯誤」不知怎的,ceil並沒有做它應該做的事情,只是通過「蘭特(1)*結束」 – FxH

+0

什麼是這ceil'我的是'內置(C:\ Program Files文件\ MATLAB \ R2013b \工具箱\ MATLAB \ elfun \ @double \小區)的'輸出。?%的雙方法'。 – user664303

+0

'內置的(C:\ Program Files文件(x86)\ MATLAB \ R2012b \ toolbox \ matlab \ elfun \ @double \ ceil)%double method' – FxH

0

我確實重載,就像user664303建議的一樣!因爲我不能在我的項目中使用的對象,我想,其行爲類似的功能,所以我寫了:

function varargout = table(mode, varargin) 
persistent table; 

if isempty(table) && ~strcmp(mode,'writeTable') 
    error(...) 
end 

switch mode 
    case 'getValue' 
     ... 
    case 'writeTable' 
     table = ... 
    ... 
end 
end 

想避免經過尺寸表中每一個電話,並認爲這將是不夠的,如果第一呼叫使用mode='writeTable'初始化表。看起來像這導致了我的問題。 改成後沒問題:

if isempty(table) 
    table = zeros(dim1,dim2,...) 
end