在MATLAB中矢量化最小索引的检查

时间:2015-10-17 18:04:07

标签: matlab vectorization

我有一个名为' r' 201个实数值,另一个名为' knots' 21个真实值。 我想找到每一个' r'估计最小的结的索引i。价值大于' r'值。我是否必须在' for'绕过' r'矢量,或者有没有办法可以矢量化代码,所以我可以避免for循环?

1 个答案:

答案 0 :(得分:1)

不,你可以避免循环。您可以将bsxfunmax结合使用。我不知道rknots的形状是什么......如果它们是行或列向量,那么我将使代码独立于此事实。请注意,我要编写的内容假定r中至少有一个元素knots中的值大于r。如果不是,则此代码无法正常工作。

这样的事情就是我想到的:

rs = r(:).'; %// Make sure r a row vector '
[knotss,indk] = sort(knots(:)); %// Make sure knots a column vector

%// Make sure that the values are sorted
%// For each value in knots, find all values that are greater than r
check = bsxfun(@gt, knotss, rs);

%// Determine the right indices for each value of knots in sorted array
[~,indc] = max(check, [], 1);

%// Get the original indices
indices = indk(indc);

前两行代码确保r是行向量,knots是列向量。我们还排序 knots中的值,因为您希望找到knots的最小值,该值大于r中的值。它使我们能够提高效率。我还返回knots的实际排序,因为当我们在knots中找到大于某个值r的最小值的位置时,我们必须返回原始顺序。

接下来,对bsxfun的调用会创建一个2D布尔矩阵checkcheck中的每列都适用于knots中的每个值。具体而言,每列都会告诉您knots的哪些值大于r中的值。对于每列,false表示r中的相应值不大于您正在查看的knots中的值,否则true。找到此矩阵后,您可以调用max并单独检查每个列。致电max时,只会返回遇到最大值的第一个时间。因为布尔矩阵仅由零和1组成,所以这有效地为您提供了第一次每行遇到true值,这表示r可能的最小可能索引大于每个值在knots

您不需要查看实际的最大值,但是您希望索引出现此最大值的位置,因此创建变量indices并且是第二个来自max的输出。

这是一个包含一些测试数据的简单示例:

r = [-1 0];
knots = [3 -1 1 0 -3];

运行上面的代码,我得到了我的索引:

indices =

     4
     3

这是有道理的。 r的第一个值是-1,而knotsknots大于-1的最小可能值的值是值0,位于位置4。 r的第二个值为0,knotsknots大于1的最小可能值的值为1,位于第3位。