Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MATLAB] MATLAB Function и С MEX S-function, При работе с мтарицами 
:(
    Опции темы
cucutnog
Дата 19.11.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.11.2012

Репутация: нет
Всего: нет



Добрый день.

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

На входе блока в 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. Матрица одна и там и там, разумеется.

user posted image


Задавая различные 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);
}



Кто разбирается,скажите,пожалуйста,в чем может быть дело.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Математические пакеты | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.