首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在matlab中查找最小元素的索引

在matlab中查找最小元素的索引
EN

Stack Overflow用户
提问于 2012-11-11 20:22:36
回答 1查看 2.5K关注 0票数 5

这里我有两个矩阵,一个表示成本,另一个决定何时进行比较。

代码语言:javascript
运行
复制
cost =      [0.2 0.0 0.3; 0.4 0 0; 0.5 0 0];
available = [1   1   0  ; 1   0 0; 0   0 0];
available = logical(available);

我希望获得成本矩阵中最小可用元素的索引,在本例中,它将比较0.20.00.4,并返回0.0的索引,即成本矩阵中的(1, 2)4

我试过了

代码语言:javascript
运行
复制
mul = cost .* available;     % Zero if not available, but I can't know if it is zero because cost is zero
mul(~mul) = nan;             % Set zero to be NaN
[minVal, minId] = min(mul)

这将有助于获得最小非零成本,但如果存在可用的零个元素,则将是错误的。

那么有没有更好的方法呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-11 20:28:53

这里有两种可能的解决方案。两者本质上都涉及将所有不可用成本转换为Inf

代码语言:javascript
运行
复制
%#Set up an example
Cost =      [0.2 0 0.3; 0.4 0 0; 0.5 0 0];
Available = [1   1   0; 1   0 0; 0   0 0];

%#Transform non-available costs to Inf
Cost(Available == 0) = Inf;

%#Obtain indices using find
[r, c] = find(Cost == min(min(Cost)))

%#Obtain linear indices and convert using ind2sub
[~, I1] = min(Cost(:));
[r2, c2] = ind2sub(size(Cost), I1);

两种解决方案都只会返回实例中没有唯一最小值的第一个最小值。此外,在所有可用的成本都是Inf的情况下,该方法将失败(但我猜如果所有成本都是无限的,那么您会遇到更大的问题……)。

我已经做了一些速度测试,第二种方法绝对更快,无论Cost的维度是什么,因此应该严格优先使用。此外,如果您只想要线性索引而不是下标索引,那么您当然可以放弃对ind2sub的调用。然而,这并没有在效率上给你带来巨大的节省,所以如果你对下标索引有偏好,那么你应该使用它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13331088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档