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

Posted

技术标签:

【中文标题】在向量中查找具有相同最大值的条目的函数【英文标题】:Function to find entries with same maximum value in a vector 【发布时间】:2014-01-15 14:57:57 【问题描述】:

在我的项目中,我需要一个函数来返回给定向量的最大元素的索引。就像max。对于具有相同最大值的多个条目(经常出现),该函数应随机选择一个。不像max

该函数是 Simulink 中 MATLAB Function 模块中的子函数。整个 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)) &lt; tolerance; 但不知道这有什么帮助。此外,它不能解决我的随机选择问题。 希望有人有更多的想法,或者至少可以给我一些提示!

我在 Windows7-64 位 PC 上使用 MATLAB R2012b(32 位)和 Lcc-win32 C 2.4.1 编译器。

编辑: 矢量通常大小为 5x1,包含介于 -2000 和零之间的值,它们是双精度类型,例如vector = [-1000 -1200 -1000 -1100 -1550]'。但我认为这样一个简单的函数应该适用于任何类型的输入向量。

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

【问题讨论】:

什么不起作用?在 matlab 中试过你的代码,它似乎很好? 在 MATLAB 中它对我来说也很好用。但运行 Simulink 模型会导致运行时错误,提示:“预期为整数值,发现值为 4.07362 的非整数变量随机。”对于具有以下内容的行:ind=index_max(random); 嗯。这很有趣.. 自己实现 ceil。 你能贴出你的矢量图吗?我猜有很多使用findrandi 的简单解决方案,但我猜你不想使用它们 【参考方案1】:
function v= findOpt(v)
if isempty(v)
    return;
end
v = find((max(v) - v) < 0.00001);
v = v(ceil(rand(1)*end));
end

【讨论】:

试过了,但仍然出现“ceil(rand(1)*end)”的运行时错误"。 which ceil 的输出是什么?我的是built-in (C:\Program Files\MATLAB\R2013b\toolbox\matlab\elfun\@double\ceil) % double method built-in (C:\Program Files (x86)\MATLAB\R2012b\toolbox\matlab\elfun\@double\ceil) % double method【参考方案2】:

我确实超载了,就像 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

【讨论】:

以上是关于在向量中查找具有相同最大值的条目的函数的主要内容,如果未能解决你的问题,请参考以下文章

查找O(n)时间中的n个最大条目

查找地图中的最大值

查找具有相同内部表示的浮点数/双精度数的最小值/最大值

需要帮助编写一个函数来查找 N 维数组 C++ 中的最大值和最小值

使用 STL 算法在表(向量的向量、二维数组)中查找最小值/最大值的优雅方法

在 postgresql 表中查找最大条目,sql