假设我有一个浮点数向量。调用它x
。
通常如果我想要其中的最大数x
,我可以调用 matlab 函数max(x)
。
但是,假设我想要最大的数字,但不包括向量中的某些索引,这些索引在其他向量中指定。
最直接的方法(以及我在 C 中的方法)是遍历向量并不断更新最大值,同时跳过我的第二个向量中的任何索引。也就是说,对最大值进行线性搜索并跳过我不想要的索引。
但是,我想知道在 Matlab 中是否有一种更传统的方法来解决这个问题。
假设我有一个浮点数向量。调用它x
。
通常如果我想要其中的最大数x
,我可以调用 matlab 函数max(x)
。
但是,假设我想要最大的数字,但不包括向量中的某些索引,这些索引在其他向量中指定。
最直接的方法(以及我在 C 中的方法)是遍历向量并不断更新最大值,同时跳过我的第二个向量中的任何索引。也就是说,对最大值进行线性搜索并跳过我不想要的索引。
但是,我想知道在 Matlab 中是否有一种更传统的方法来解决这个问题。
使用逻辑索引切片向量/矩阵通常是要走的路:
http://blogs.mathworks.com/steve/2008/01/28/logical-indexing/
听起来您已经有了索引,因此您可以简单地将其转换为如下逻辑索引:
exclude = [ ... ];
include = ones(size(x));
include(exclude) = 0;
max_m = max(x(include));
max
如果您只需要该值,则Paddy的解决方案是好的。但是,如果您还需要最大值的索引,您就不能再这样做了
[max_m max_m_i] = max( x(include) );
由于索引max_m_i
将相对于缩减后的数组x(include)
,而不是原始数组的索引x
。
为了避免这种情况,您可以使用逻辑索引
include = true( size(x) );
include( exclude ) = false;
[max_m max_m_i] = max( x .* include - inf .* ( ~include ) );
这样,我们将排除的位置设置为-inf
它们在那里(因此索引不会损坏),但它们不会被选为max
.