2015-10-17 27 views
0

我有一個名爲'r'的201個實數值的向量,另一個名爲'knots'的向量是21個實數值。 我想爲每個'r'值找到比'r'值大的最小'結'值的索引i。我是否必須在'for'循環中通過'r'向量執行該操作,還是有一種方法可以對代碼進行向量化,以便避免for循環?矢量化MATLAB中最小索引的檢查

回答

1

不可以避免循環。您可以使用bsxfun加上max。我不知道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中的值,因爲您要查找大於r中的值的最小值knots。它使我們能夠提高效率。我還返回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,並且knots中的值knots大於-1的最小可能值爲值0,位於位置4.第二個值r爲0,值爲knotsknots大於1的最小可能值爲1,並且位於位置3.