2016-12-04 23 views
0

我已將垂直連接的文件從我的目錄轉換爲大小約爲60000 x 15(已驗證)的矩陣。'查找'功能工作不正常,已嘗試浮點精度分辨率

d=dir('*.log'); 
n=length(d); 
data=[]; 
for k=1:n 
    data{k}=importdata(d(k).name); 
end 
total=[]; 
for k=1:n 
    total=[total;data{n}]; 
end 

我使用的是以下32迭代循環和「查找」功能來定位的行號,其中最後一列是對應於環路的整數迭代的整數:

for i=1:32 
    v=[]; 
    vn=[]; 
    [v,vn]=find(abs(fix(i)-fix(total))<eps); 
    g=length(v) 
end 

我試圖通過對'i'的值使用'fix'和來自matrix'total'的值來解釋浮點精度,另外還要考慮它們的絕對差異並檢查它小於'eps'的容差浮點相對精度函數),最大公差爲0.99。

「查找」功能無法正常工作。它只適用於某些整數(儘管它應該定位所有這些(1-32)),並且對於整數,它確實發現值是不完整的。

這裏有什麼問題?如果「查找」不適合這個目的,那麼什麼是合適的選擇?

+3

我要去這裏走出去的肢體,並說,'find'工作就好替換代碼的第一個塊,你誤會如何作品。這可能值得支持,並告訴我們你實際上想做什麼,因爲它不清楚。 – Suever

+0

矩陣的第15列是整數值在1-32之間的唯一列,因此,查找函數應該返回帶有歸因於該特定整數的行號的向量'v'(vn是不相關的)。輸出結果顯示,對於許多不應該爲零的整數,v的長度爲零。我需要使用向量'v'來定位行號,從中我可以從矩陣'總'中的不同列中獲取相應的數據。這是否清理了事情? – romanex

+0

您可能希望將total(:)作爲total來編寫爲60000 x 15.此外,您可以使用[cell2mat](https://www.mathworks.com/help/matlab/ref/cell2mat.html)在第一個代碼中。 –

回答

2

你得到了很多零,因爲你正在尋找不只是在data整個數據矩陣的列第15所以你將有大量的非整數。

而且,你正在使用的兩個號碼fix和自浮點錯誤可能導致數略高於低於期望的整數,這將導致低於那些以本輪下跌整數低於你的預期。您應該使用round來四捨五入到最接近的整數。

而不是使用find要做到這一點,我會用簡單的布爾邏輯來確定最後一列

for k = 1:32 
    % Compare column 15 to the current index 
    matches = abs(total(:,end) - k) < eps; 

    % Do stuff with these matches 
    g = sum(matches); % Count the matches 
end 

根據你想實際的數據做什麼的價值,你或許可以使用最後一列作爲accumarray的輸入,以對每個組執行操作。

作爲一個側面說明,你可以用

d = dir('*.log'); 

data = cellfun(@importdata, {d.name}, 'UniformOutput', false); 
total = cat(1, data{:}); 
+0

您在第一個代碼塊中發佈的解決方案不適用於整數:2,3,5,6,7,8,9,10,12,13,16,17,20,23,25,26,29, 30,31 – romanex

+0

我使用了你的串聯版本,以及循環的浮點友好版本,看起來像它的工作。非常感激 – romanex