我有一个名为' r' 201个实数值,另一个名为' knots' 21个真实值。 我想找到每一个' r'估计最小的结的索引i。价值大于' r'值。我是否必须在' for'绕过' r'矢量,或者有没有办法可以矢量化代码,所以我可以避免for循环?
答案 0 :(得分:1)
不,你可以避免循环。您可以将bsxfun
与max
结合使用。我不知道r
和knots
的形状是什么......如果它们是行或列向量,那么我将使代码独立于此事实。请注意,我要编写的内容假定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布尔矩阵check
。 check
中的每列都适用于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,而knots
中knots
大于-1的最小可能值的值是值0,位于位置4。 r
的第二个值为0,knots
中knots
大于1的最小可能值的值为1,位于第3位。