2014-01-15 132 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