2012-06-13 3 views
0

Я хотел бы решить уравнение (A * x = b) с помощью Matlab в моем приложении iOS. Я сгенерировал исходные файлы C и добавил их в Xcode. Странно то, что для тех же (A, b) я получаю разные результаты в Matlab и Xcode.Сгенерированный код Matlab C не работает должным образом

Я использую настройки по умолчанию. Любое предложение?

Matlab:

%#codegen 
function X = solveEquation(A, B) 
    X = linsolve(A,B); 
end 

Xcode:

double* A_data = malloc(num * num * sizeof(double));  
double* B_data = malloc(num * sizeof(double)); 
for (int i=0; i<num; i++) { 
    for (int j=0; j<num; j++) { 
     double sum = 0.0; 
     for (int k=0; k<9; k++) { 
      double diff = powf(A[i][k]-A[j][k],2); 
      sum += diff; 
     } 
     A_data[j*num+i] = exp(sum/-2); 
    } 
    B_data[i] = A[i][9]; 
} 

int A_sizes[] = {num, num}; 
int B_sizes[] = {num, 1}; 
double* X_data = malloc(num * sizeof(double)); 
int X_sizes[] = {num, 1}; 
solveEquation(A_data, A_sizes, B_data, B_sizes, X_data, X_sizes); 
+0

Какие результаты у вас есть? –

+0

Начните с проверки того, что ваши входы A и B одинаковы с обеих сторон. Не забывайте, что индексы MATLAB - столбцы, а индексы C - рядовые. Кроме того, 'powf' является неправильной функцией для удвоений. Используйте 'pow()', или даже лучше, просто умножайте их самостоятельно. – Peter

+0

'B_data [i] = A [i] [9];' индексируется за пределы (инициализированного) размера. (и, мы надеемся: 9 <размер.) – wildplasser

ответ

0

Как результаты отличаются? Возможно (даже вероятно), что числа Matlab более сложны, чем тип данных C double. Это может привести к различию в точности между результатами.

+0

Забавно, что я выписываю матрицу из Xcode в% 2.3f в уменьшенном формате (обычно значениям требуется более 3-х цифр точности), а после этого я загружаю Matlab. И тем не менее, Matlab может решить задачу линейного уравнения лучше, чем статическая библиотека. Остатки намного меньше. –

+0

@ Kukoda нет ничего странного в этом, если промежуточные операции точнее в Matlab, чем Xcode. –

+0

Вы правы, этот MATLAB Coder сосать, по некорректной проблеме вы не можете его использовать. –