2013-03-26 4 views
0

Я создаю огромную программу в C++ для компьютерного зрения, а для целей отладки я использую Matlab. После того, как я сражался с ним, я понял, что ответ простого простого арифметического уравнения отличается при использовании Matlab и C++ (Visual Studio 9 компилятор BTW). почему это?Почему Matlab дает другое значение, чем C++

Здесь арифметическая операция:

Matlab функции:

function [x,y]=shape_fun(p,shape,Ax,Ay) 

x=p(1)+Ax+shape(1)+Ax.*shape(3)+Ay.*shape(4)+Ax.*Ax.*shape(5)/2+Ay.*Ay.*shape(6)/2+Ax.*Ay.*shape(7); 
y=p(2)+Ay+shape(2)+Ax.*shape(8)+Ay.*shape(9)+Ax.*Ax.*shape(10)/2+Ay.*Ay.*shape(11)/2+Ax.*Ay.*shape(12); 

end 

С ++ функция

cv::Point2d deformed(const double shape_fun[12],const cv::Point2d p,const double Ax,const double Ay){ 
    cv::Point2d result; 

    result.x=(p.x+Ax)+shape_fun[0]+shape_fun[2]*Ax+shape_fun[3]*Ay+shape_fun[4]*Ax*Ax/2*shape_fun[5]*Ay*Ay/2+shape_fun[6]*Ax*Ay; 
    result.y=(p.y+Ay)+shape_fun[1]+shape_fun[7]*Ax+shape_fun[8]*Ay+shape_fun[9]*Ax*Ax/2*shape_fun[10]*Ay*Ay/2+shape_fun[11]*Ax*Ay; 
    return result; 

} 

данных:

Примечание. Значения Matlab скопированы из значений C++ debbuger, они ТОЧНО одинаковы.

Ax=-12 
Ay=-12 
p=[468,683]; 
shape=[ 
    63.178114688537441 
    36.536135487588474 

    -0.038695673779030673 
    -0.045313362559036965 

    0.016469896824803026 
    0.0017122284868442948 
    -0.0030285669997117204 

    -0.067902655024060773 
    0.17995980761526389 

    0.012716871878336870 
    -0.036890386929202310 
    -0.00081243692842574420 
]; 

результаты:

Matlab:

x = 
    3.947029931219995e+02 
y = 
    7.043339656551383e+02 

C++:

result {x=393.54007007383439 y=703.64248713855773 } cv::Point_<double> 

Примечание: Я не помечать вопрос как OpenCV с целью. Хотя, очевидно, я использую OpenCV в C++, cv::Point2d - это просто структура с двумя переменными double, x и y, и я не думаю, что этот вопрос составляет около OpenCV.

+0

Во-первых, сделать вашу арифметику, по крайней мере пограничное разборчиво. Пожалуйста. –

+0

Просто для подтверждения: вы беспокоитесь о небольшой разнице, а не о коэффициенте 100 против e + 02 вправо? –

+1

Я думаю, что некоторые из ваших * должны быть + (или наоборот). Посмотрите на формулы близко, они не совпадают. – john

ответ

10
result.x= 
    (p.x+Ax)+ 
    shape_fun[0]+ 
    shape_fun[2]*Ax+ 
    shape_fun[3]*Ay+ 
    shape_fun[4]*Ax*Ax/2* 
    shape_fun[5]*Ay*Ay/2+ 
    shape_fun[6]*Ax*Ay; 
result.y= 
    (p.y+Ay)+ 
    shape_fun[1]+ 
    shape_fun[7]*Ax+ 
    shape_fun[8]*Ay+ 
    shape_fun[9]*Ax*Ax/2* 
    shape_fun[10]*Ay*Ay/2+ 
    shape_fun[11]*Ax*Ay; 

должно быть (предположительно)

result.x= 
    (p.x+Ax)+ 
    shape_fun[0]+ 
    shape_fun[2]*Ax+ 
    shape_fun[3]*Ay+ 
    shape_fun[4]*Ax*Ax/2+ /** change here **/ 
    shape_fun[5]*Ay*Ay/2+ 
    shape_fun[6]*Ax*Ay; 
result.y= 
    (p.y+Ay)+ 
    shape_fun[1]+ 
    shape_fun[7]*Ax+ 
    shape_fun[8]*Ay+ 
    shape_fun[9]*Ax*Ax/2+ /** change here **/ 
    shape_fun[10]*Ay*Ay/2+ 
    shape_fun[11]*Ax*Ay; 
+0

Нет, это должно быть в цикле 'for' вместо этого, определенно. – 2013-03-26 16:29:21

+2

-1: Нужна больше jQuery –

+0

@LightnessRacesinOrbit Не смешно, это ** должно быть решено с помощью Python. – 2013-03-26 16:30:33

Смежные вопросы