我有一个名为'r'的201个实数值的向量,另一个名为'knots'的向量是21个实数值。 我想为每个'r'值找到比'r'值大的最小'结'值的索引i。我是否必须在'for'循环中通过'r'向量执行该操作,还是有一种方法可以对代码进行向量化,以便避免for循环?矢量化MATLAB中最小索引的检查
0
A
回答
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
中的值,因为您要查找大于r
中的值的最小值knots
。它使我们能够提高效率。我还返回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.
相关问题
- 1. 最小化矢量的MATLAB代码
- 2. 矢量化查找来自边界的最小值索引
- 3. 带有矢量的MATLAB中的索引
- 4. Matlab:优化缩小矢量大小
- 5. 在matlab中检查各种矢量
- 6. 矢量化numpy中的索引操作
- 7. 矢量化的实施来获得最小的元素的索引每行中
- 8. 在matlab矢量中查找唯一索引?
- 9. 如何在Clojure中查找此矢量的最小成员的索引?
- 10. 查找矢量矢量的最大/最小值
- 11. MATLAB:在MATLAB中矢量化for循环
- 12. 如何检查矢量中的索引是否已被使用
- 13. 在Rcpp中查找最小矢量
- 14. matlab for-loop矢量化
- 15. matlab for循环矢量化
- 16. 矢量化解决MATLAB
- 17. 使用较小的矢量在Matlab中填充矢量
- 18. 查找给定矢量的最小值
- 19. 'for'loop vs在MATLAB中的矢量化
- 20. uintmax_t矢量索引
- 21. C++中矢量向量中索引的最有效排序
- 22. 在Matlab中向量化范围检查
- 23. Lucene检查索引大小
- 24. 从矢量C++中查找最高和最低元素的索引
- 25. 如何在Matlab中矢量化循环?
- 26. 如何在matlab中“矢量化”corrcoeff?
- 27. 在Matlab中矢量化代码
- 28. Matlab:在一步中矢量化转置?
- 29. Matlab - 索引变量
- 30. Matlab的矩阵最小化