Портирование с Matlab на C - PullRequest
1 голос
/ 22 июля 2011

Я работаю над несколькими подпрограммами, которые я должен перенести из Matlab в Ansi-C. Так как я не ветеран Matlab, я пытаюсь спросить вас о некоторых загадочных строках.

1)

%Matlab
[X,Y] = meshgrid(-k:k,-k:k);

Предполагая, что k == 3, вышеупомянутая строка должна составить ДВУХ Матрицу (X и Y) со следующим аспектом:

   [-3, -2, -1, 0, 1, 2, 3]
   [-3, -2, -1, 0, 1, 2, 3]
   [-3, -2, -1, 0, 1, 2, 3]
X= [-3, -2, -1, 0, 1, 2, 3]
   [-3, -2, -1, 0, 1, 2, 3]
   [-3, -2, -1, 0, 1, 2, 3]
   [-3, -2, -1, 0, 1, 2, 3]


   [-3, -3, -3, -3, -3, -3, -3]
   [-2, -2, -2, -2, -2, -2, -2]
   [-1, -1, -1, -1, -1, -1, -1]
Y= [ 0,  0,  0,  0,  0,  0,  0]
   [ 1,  1,  1,  1,  1,  1,  1]
   [ 2,  2,  2,  2,  2,  2,  2]
   [ 3,  3,  3,  3,  3,  3,  3]

это правильно?

2) Следующее утверждение, я полагаю, создает подматрицу, есть ли эффективный способ преобразовать ее в обычный C?

I = A(iMin:iMax,jMin:jMax,:); 

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 22 июля 2011

Относительно вашего второго вопроса, здесь нет ярлыка, если вы не хотите использовать другие библиотеки.Операция называется нарезка массива , поэтому Google может помочь, если вы ищете библиотеку C, которая может предложить нечто подобное.

Кроме того, если вы не против написать его на C ++ вместо C, вы можете взглянуть на http://arma.sourceforge.net/docs.html#syntax Существуют различные другие библиотеки линейной алгебры на C и C ++, я уверен,но броненосец, кажется, ближе всего к тому, что может предложить MATLAB.

1 голос
/ 26 июля 2011

1) Да, но если вы пишете свой собственный код, нет смысла тратить все пространство на дублирование. X-Vector и Y-Vector как таковые:

int X[] = {-3, -2, -1, 0, 1, 2, 3};
int Y[] = {-3, -2, -1, 0, 1, 2, 3};

позволит вам получить доступ к той же информации, но без потери памяти (что может быть большой проблемой во встроенной системе). Вместо доступа к X(i,j) и Y(i,j) вы получаете доступ к X[i] и Y[j].

2) В зависимости от размера ваших массивов, могут быть более эффективные варианты, чем доступ элемент за элементом. Предполагая, что вы храните свой массив в главном порядке строк (т.е.

A_1,1 A_1,2 A_1,3 ... A_1, n

A_2,1 ...

сохраняется A_1,1 A_1,2 A_1,3 ... A_1, n A_2,1 ...

Вы можете скопировать фрагмент следующим образом:

/* Initialization code omitted, let A be n x m */
/* Also assuming that [i/j][Max/Min] are zero indexed */
int i, diff_i, diff_j;
diff_i = iMax - iMin;
diff_j = jMax - jMin;

size_t stride = sizeof(YOUR DATA TYPE HERE) * (1 + diff_j);

/* I = A(iMin:iMax,jMin:jMax,:); */
for(i = 0; i <= diff_i; i++){
    memcpy(&I[i*diff_j],&A[i*m + jMin],stride);
}

Это будет захватывать строку за раз, а не один элемент за раз.

1 голос
/ 22 июля 2011

1) Да: -)

2) Я полагаю, вам нужно перебрать второй и третий индексы (давайте назовем их j и k) массива и скопировать каждый из диапазонов формы A(iMin: iMax, j, k) вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...