我有一個名爲'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. 如何查找矢量中n個最小元素的索引
- 6. Matlab:優化縮小矢量大小
- 7. 矢量化的搜索功能的matlab
- 8. 如何矢量化索引?
- 9. 在matlab中檢查各種矢量
- 10. 矢量化numpy中的索引操作
- 11. 矢量化的實施來獲得最小的元素的索引每行中
- 12. 矢量的索引/最大值/最小值<double> C++
- 13. MATLAB使用行和列索引矢量
- 14. 在matlab矢量中查找唯一索引?
- 15. 查找矢量中的最小值
- 16. 查找矢量矢量的最大/最小值
- 17. 如何在Clojure中查找此矢量的最小成員的索引?
- 18. MATLAB:在MATLAB中矢量化for循環
- 19. 如何檢查矢量中的索引是否已被使用
- 20. 在Rcpp中查找最小矢量
- 21. 查找matlab中最小元素的索引
- 22. 如何在矢量化MATLAB
- 23. matlab for-loop矢量化
- 24. matlab for循環矢量化
- 25. MATLAB bsxfun或矢量化
- 26. 矢量化matlab函數
- 27. 矢量化解決MATLAB
- 28. 查找給定矢量的最小值
- 29. 使用較小的矢量在Matlab中填充矢量
- 30. 'for'loop vs在MATLAB中的矢量化