2011-03-13 97 views
1

如何從矩陣中選取最接近或等於K = 0.5的值?我知道我可以通過取絕對值和最小值從矩陣中獲得值。但是,我希望能夠遍歷矩陣,檢查第一個元素是否相等K,如果相等,則取其索引並中斷。但是,如果第一個元素不等於K,循環直到找到等於K的值。繼續直到所有等於K的值都耗盡。任何人都可以指引我走向正確的方向嗎?提前致謝。如何計算最接近或等於0.5的值?

這裏是我的代碼:(我沒有足夠的積分,使這個評論,而不是一個答案)

data = rand(10,2);k =0.5; 
indr = find(data(:,1)); 
cNum = data(1,1); 
if cNum < k 
    old_distance = abs(k - cNum); 
else 
    old_distance = abs(cNum - k); 
end 
Xdata = data(2:end,:); 
indeX = find(Xdata(:,1)); 
for i = 1:size(Xdata,1) 
    if Xdata(i,1) < k 
     min_Val = abs(k-Xdata(i,1));  
     new_distance = min(min_Val);   
    else 
     min_Val = abs(Xdata(i,1) -k); 
     new_distance = min(min_Val);   
    end 
    if (new_distance < old_distance) 
     old_distance = new_distance;   
     cNum = Xdata(i,1);    
    end  
end 
cNum_indeX = indr(indeXm); 
Y = cNum; 
X = indr(cNum_indeX);' 

回答

0

問題的約束不夠清晰

  • 這裏速度至關重要嗎?如果是這樣,那麼你應該避免任何形式的顯式循環。使用內建函數通常會更好,除非矩陣非常龐大,並且當您找到足夠近的時候想要中斷時。如果它有數百萬條記錄,我會把它分成10000個左右的塊,然後讓MATLAB在分塊上使用min函數。或行。或專欄。取決於你想要做什麼。

  • 距離足夠近?你用一個隨機矩陣來演示,但是你期望在0.5的舍入誤差內有什麼嗎?

  • 您是否知道[value,index]=min(x)會給出值指數的最小值?

我假設矩陣必須大,否則就沒有缺點讓MATLAB做矢量:

[colminval,colminind]=min(abs(x-0.5)); 
[minval,rowminind]=min(colminval); 

這是我可以毫不更多...方向上做的最好的。

+0

是的,我有[值,指數=分鐘(X)在我的代碼。我想遍歷整個矩陣,最接近0.5的值。 – user587646 2011-03-13 07:58:53

+0

其實,下一個解決方案比我的要好,但我仍然不明白你想要做什麼以及爲什麼這些解決方案是不夠的。他們認爲符合你所述的標準。 – Ricky 2011-03-13 08:06:03

+1

@ user587646:R.M.的解決方案就是您要找的。邏輯索引比循環快得多。 – 2011-03-13 14:57:15

2

For循環很少是MATLAB中的答案。假設你想檢查你的數組元素是否在K ± tol之內,其中tol是你設置的一些容差。你可以通過簡單的邏輯索引來做到這一點。

K=0.5; 
tol=0.001; %# set your tolerance here 

boolIndex=xVector<=K+tol & xVector>=K-tol; %# xVector is your vector 

現在boolIndex只是0的和1的邏輯索引數組。無論數組元素滿足此條件,它都會給出1。你可以直接使用它來索引你的矢量以便進一步操作。如果出於某種原因,你需要確切的指數,你可以通過做find(boolIndex==1)得到他們。

+0

你可以運行'find(boolIndex)' - 不需要檢查一個邏輯變量是否爲1.注意,如果這個解決方案遠離目標的'tol',它不會給出最接近0.5的值。 – Jonas 2011-03-13 19:15:09

4

要查找向量中最接近的值,你可以這樣做一個特定的值:

 
>> data = rand(10, 1) 

data = 

    0.7060 
    0.0318 
    0.2769 
    0.0462 
    0.0971 
    0.8235 
    0.6948 
    0.3171 
    0.9502 
    0.0344 

>> k = 0.5; 
>> [~, index] = min(abs(data - k)); 
>> closestValue = data(index) 

closestValue = 

    0.3171