2010-04-19 5 views
2

저는 두 가지 데이터 배열을 가지고 있습니다. 하나는 실험의 다른 데이터와 함께 첫 번째 열의 실험에서 발생한 실제 대기 시간 (예 : 0.345, 0.455 ... 소수점 이하 3 자리)을 포함합니다. 다른 하나는 실제로 0.001에서 0.500까지의 레이턴시를 '조회'목록과 함께 다른 데이터 조각과 함께 0.001 단위로 포함합니다. 두 데이터 세트는 모두 X에서 Y로 두 배가됩니다. 내가 할 노력하고있어MATLAB에서 찾기 기능을 사용하는 데 문제가 있습니다

는 찾아 대기 시간이 실제 대기 시간에 해당하는 경우 predicted_data의 관련 행을 찾기 위해 ...

for i = 1:length(actual_latency) 
    row = find(predicted_data(:,1) == actual_latency(i)) 
    full_set(i,1:4) = [actual_latency(i) other_info(i) predicted_info(row,2) ... 
         predicted_info(row,3)]; 
end 

... 뭔가 같은 것입니다. 그런 다음 이것을 사용하여 합병 된 데이터 세트 full_set을 생성했습니다.

나는이 정말 간단 할 거라 생각하지만, 찾기 기능 (나는 두 번 확인 디버깅 동안했습니다으로) 내가이 predicted_data(:,1)에 알고 실제 대기를 찾을 때 빈 행렬을 던져 실패 유지합니다.

또한 동일한 작업을 수행하기 위해 for 루프를 find로 바꾸면 비슷한 오류가 발생합니다. 체계적인 것으로 보이지는 않습니다. 다른 참여자 데이터 세트를 사용하면 다른 위치에 던집니다.

또한 디버깅 모드에서 찾기를 사용하여 하드 코드 된 값 actual_latency을 찾으면 항상 작동하지 않습니다. 때로는 예, 가끔은 없습니다.

나는 정말 내 머리를 긁어 모으고 있습니다. 누군가가 어떤 일이 일어나고 있는지에 대한 아이디어가 있다면 정말 감사 할 것입니다.

predicted_data(:,1) == actual_latency(i) 

비록 당신의 숫자가 여전히 매우 다를 수 있습니다 만 정밀도의 소수점 이하 세 자리가에을 표시 : 당신은 가능성이 소수점 비교 부동의 문제로 실행하는

+2

괄호가 없습니다. 괄호가 없습니다. –

답변

5

당신은 다음 작업을 수행 할 때 소량이 표시되지 않으므로 FIND부터 정확히 일치를 얻을 수 없으므로 빈 행렬을 제공합니다.

부동 소수점 숫자의 한 가지 특징은 특정 정수를 2의 정수 배수가 아니기 때문에 정확하게 표현할 수 없다는 것입니다. 이것은 0.1과 0.001의 숫자에서 발생합니다. 이 숫자 중 하나를 반복적으로 추가하거나 곱하면 예기치 않은 동작이 발생할 수 있습니다. Amro는 그의 말에 하나의 예를 지적했다. 0.3이 아니고 정확히3*0.1과 같다. 또한 두 가지 방법으로 대기 시간 목록을 작성하여 설명 할 수 있습니다.

vec2 = linspace(0.001,0.5,500); 

당신은이 두 벡터가 서로 동일 할 것 같아,하지만 다시 생각해! :

>> isequal(vec1,vec2) 

ans = 

    0 %# FALSE! 
:

vec1 = 0.001:0.001:0.5; 

아니면 LINSPACE을 사용할 수 있습니다 : 당신은이 colon syntax 정상 사용할 수 있습니다

두 가지 방법은 서로 다른 방식으로 0.001의 연속적인 덧셈 또는 곱셈을 수행하여 벡터를 생성하므로 매우 다른 값을 제공합니다 벡터의 일부 항목은 자세한 내용은 this technical solution을 참조하십시오.

부동 소수점 수를 비교할 때 약간의 허용 오차를 사용하여 비교해야합니다.

tolerance = 0.0001; 
for i = 1:length(actual_latency) 
    row = find(abs(predicted_data(:,1) - actual_latency(i)) < tolerance); 
    ... 

부동 소수점 비교의 주제는이 related question에 덮여있다 : 예를 들어,이 실제 대기의 0.0001 내에있는 룩업 목록의 항목의 인덱스를 찾습니다.

+2

부동 소수점 비교에 대한 간단한 예제는 다음과 같습니다.'(0.3 == 0.1 * 3)'[이것은 거짓으로 평가 될 것입니다.] – Amro

+0

그건 치료를했습니다; 매우 감사합니다! –

2

당신은 다음을 수행하려고 할 수 있습니다 :

row = find(abs(predicted_data(:,1) - actual_latency(i))) < eps) 

EPS 부동 소수점 연산의 정밀도입니다.

+1

+1 - eps에 대해 모르겠다 – Doresoom

+3

'abs (predicted_data (:, 1) - actual_latency (i)) <3 * eps (predicted_data (:, 1)'와 같은 someting을하는 것이 더 좋을 수 있습니다. 'abs' 호출이 큰 경우, 여러 개의'eps (1)'간격이있을 수 있습니다. – mtrw

0

==가 아닌 허용치를 사용해 보셨습니까?

관련 문제