Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MATLAB Function и С MEX S-function
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
Understand
Добрый день.

Постановка задачи:

На входе блока в Simulink матрица размером G[3][4] и две константы, имеющие смысл номера строки (i) и столбца (j), соответственно. На выходе блока элемент матрицы G(i,j). Подавая различные константы в пределах размера матрицы, меняется на выходе G(i,j).


Суть проблемы:

Если смоделировать такое устройство с помощью блока MATLAB Function, прописав туда простейший m-код

Код
function C = fcn(i,j,G)

C = G(i,j);

end


все будет работать как надо


Но если реализовать эту задачу с помощью С MEX S-function, прописав в .с

Код
#include "doubleIt.h"

void fcn (int i,  int j, double G[3][4], double *C)

{
*C = G[i][j];
}


И создав файл .mexw32 с помощью Legacy code tool, я получаю на выходе не тот элемент, номер которого я заказывал с помощью констант i и j, а другой элемент, принадлежащий матрице G.
Конечно, я учитываю то, что нумерация в С идет с 0, а не с 1 , как в Матлабе.

Поясняющий рисунок, на котором сверху эта задача решается в MATLAB Function, а снизу в С MEX S-function. Матрица одна и там и там, разумеется.




Задавая различные i и j получаю следующие результаты на выходе С MEX S-function

i j G(i,j)

[0] [0] 1
[1] [0] 6
[2] [0] 11
[3] [0] 6
[0] [1] 5
[0] [2] 9
[0] [3] 2
[0] [4] 6
[0] [5] 10

Что интересно: Если менять только номер j-ого элемента, а i=0, то выпадают числа матрицы последовтаельно перебирая мтарицу сверху вниз и слева направо. Даже при условии, что в моей мтарице j<4, можно ввести j>4 и получить число на выходе.


Возможно что-то в самом файле S-функции, который я компилирую не так. Есть опасения по-поводу указателей.


Код
static void mdlOutputs(SimStruct *S, int_T tid)
{
  /*
   * Get access to Parameter/Input/Output/DWork/size information
   */
  int16_T *u1 = (int16_T *) ssGetInputPortSignal(S, 0);
  int16_T *u2 = (int16_T *) ssGetInputPortSignal(S, 1);
  real_T *u3 = (real_T *) ssGetInputPortSignal(S, 2);
  real_T *y1 = (real_T *) ssGetOutputPortSignal(S, 0);

  /*
   * Call the legacy code function
   */
  fcn ( *u1, *u2, u3, y1);
}



Кто разбирается,скажите,пожалуйста,в чем может быть дело.
mdmitry
Цитата(Understand @ Nov 19 2012, 22:00) *
Конечно, я учитываю то, что нумерация в С идет с 0, а не с 1 , как в Матлабе.

А учитываете, что в MATLAB массивы хранятся как в фортране по столбцам? Такие вопросы вероятно лучше задавать на профильном форуме, http://forum.exponenta.ru/
Understand
Цитата(mdmitry @ Nov 20 2012, 00:37) *
А учитываете, что в MATLAB массивы хранятся как в фортране по столбцам?, http://forum.exponenta.ru/


нет. Этого я не учел. Наверное, дело в этом. Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.