Упростите умножают операции в индексации массива

Сгенерированный код может иметь, умножают операции при индексации элемента массива. Можно выбрать параметр оптимизации, Упрощают индексацию массива (Simulink Coder), чтобы заменить, умножают операции в индексе массива с временной переменной. Эта оптимизация может улучшить скорость выполнения путем сокращения числа раз, которое выполняет умножить операция.

Модель в качестве примера

Если у вас есть следующая модель:

Постоянные блоки имеют следующий Constant value:

  • Const1: reshape(1:30,[1 5 3 2])

  • Const2: reshape(1:20,[1 5 2 2])

  • Const3: reshape(1:90,[1 5 9 2])

Параметры блоков Concatenate Mode установлены в Multidimensional array. Constant блокируется, параметр Sample time устанавливается на –1.

Сгенерируйте код

Создавание модели выключенным параметром Simplify array indexing генерирует следующий код:

int32_T i;
int32_T i_0;
int32_T i_1;

for (i = 0; i < 2; i++) {
  for (i_1 = 0; i_1 < 3; i_1++) {
    for (i_0 = 0; i_0 < 5; i_0++) {
      ex_arrayindex_Y.Out[(i_0 + 5 * i_1) + 70 * i] =
        ex_arrayindex_P.Constant1_Value[(5 * i_1 + i_0) + 15 * i];
    }
  }
}

for (i = 0; i < 2; i++) {
  for (i_1 = 0; i_1 < 2; i_1++) {
    for (i_0 = 0; i_0 < 5; i_0++) {
      ex_arrayindex_Y.Out[(i_0 + 5 * (i_1 + 3)) + 70 * i] =
        ex_arrayindex_P.Constant2_Value[(5 * i_1 + i_0) + 10 * i];
    }
  }
}

for (i = 0; i < 2; i++) {
  for (i_1 = 0; i_1 < 9; i_1++) {
    for (i_0 = 0; i_0 < 5; i_0++) {
      ex_arrayindex_Y.Out[(i_0 + 5 * (i_1 + 5)) + 70 * i] =
        ex_arrayindex_P.Constant3_Value[(5 * i_1 + i_0) + 45 * i];
    }
  }
}

Сгенерируйте код с оптимизацией

Откройте диалоговое окно Configuration Parameters и выберите параметр Simplify array indexing. Создайте модель снова. В сгенерированном коде, [(i_0 + tmp_1) + tmp] заменяет умножить операцию в индексе массива, [(i_0 + 5 * i_1) + 70 * i]. Сгенерированный код теперь:

int32_T i;
int32_T i_0;
int32_T i_1;
int32_T tmp;
int32_T tmp_0;
int32_T tmp_1;

tmp = 0;
tmp_0 = 0;
for (i = 0; i < 2; i++) {
  tmp_1 = 0;
  for (i_1 = 0; i_1 < 3; i_1++) {
    for (i_0 = 0; i_0 < 5; i_0++) {
      ex_arrayindex_Y.Out[(i_0 + tmp_1) + tmp] =
        ex_arrayindex_P.Constant1_Value[(i_0 + tmp_1) + tmp_0];
    }

    tmp_1 += 5;
  }

  tmp += 70;
  tmp_0 += 15;
}

tmp = 0;
tmp_0 = 0;
for (i = 0; i < 2; i++) {
  tmp_1 = 0;
  for (i_1 = 0; i_1 < 2; i_1++) {
    for (i_0 = 0; i_0 < 5; i_0++) {
      ex_arrayindex_Y.Out[((i_0 + tmp_1) + tmp) + 15] =
        ex_arrayindex_P.Constant2_Value[(i_0 + tmp_1) + tmp_0];
    }

    tmp_1 += 5;
  }

  tmp += 70;
  tmp_0 += 10;
}

tmp = 0;
tmp_0 = 0;
for (i = 0; i < 2; i++) {
  tmp_1 = 0;
  for (i_1 = 0; i_1 < 9; i_1++) {
    for (i_0 = 0; i_0 < 5; i_0++) {
      ex_arrayindex_Y.Out[((i_0 + tmp_1) + tmp) + 25] =
        ex_arrayindex_P.Constant3_Value[(i_0 + tmp_1) + tmp_0];
    }

    tmp_1 += 5;
  }

  tmp += 70;
  tmp_0 += 45;
}

Смотрите также

Похожие темы