用于在向量中查找具有相同最大值的条目的函数

时间:2014-01-15 14:57:58

标签: matlab vector matlab-compiler

在我的项目中,我需要一个函数来返回给定向量的最大元素的索引。就像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之间的值,它们是double类型,例如vector = [-1000 -1200 -1000 -1100 -1550]'。但我认为这样一个简单的函数应该适用于任何类型的输入向量。

length(index_max)的调用导致MATLAB中的系统错误并迫使我将其关闭。我想这是由于我从find得到的奇怪回报。对于具有所有相同值的向量,find的回报类似于[1.000 2.000 1.000 2.000 0.000]',这对我来说根本没有任何意义。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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