Помощь с операциями над компактными массивами в Matlab для замены циклов for

#arrays #matlab #for-loop

#массивы #matlab #цикл for

Вопрос:

Мне нужно смоделировать лесной пожар, и для этого мне нужна цветовая карта. Цветовая карта содержит 51 строку, которая выглядит следующим образом:

Первые 10 — это градиент от темно-зеленого к желтому, и строки генерируются:

 uint8color = [4 112 31];
for i = -1:8
    cmap = double(uint8(uint8color   i*[30 27 3])) / 255
end;
  

Далее идет единственная синяя строка:

 cmap(11, :) = [0 0.5 0.9];
  

А оставшиеся 40 строк меняют цвет с желтого на красный и становятся почти черными, что выполняется следующим образом:

 for i=19:-1:-20
    farve = double(uint8(uint8farve   i*[12 12 5])) / 255;
end;
  

Это работает нормально, однако я хотел бы избегать использования циклов везде, где это возможно, и пытаться использовать операции с компактными массивами, на которые способен Matlab

Однако я совершенно застрял на вышеупомянутом, не понимая, как (и если) я могу использовать компактную нотацию, но все еще имею индекс под рукой.

Для первых 10 строк что-то вроде:

 cmap(1:10, :)
  

Заменил бы for-loop, но для этого мне потребовалось бы каким-то образом извлечь индекс и вычесть 2 из значения (1:10 -> -1:8)

Я надеюсь, что где-то есть гуру Matlab, который может указать мне правильное направление

Заранее спасибо

Ответ №1:

Первый цикл может быть переписан как:

 uint8color = [4 112 31];
i = (-1:8)';
cmap = double(uint8(repmat(uint8color, length(i), 1)   i*[30 27 3])) / 255;
  

Однако я не совсем уверен, чего вы пытаетесь достичь всеми этими приведениями…

Комментарии:

1. Это работает отлично! Я не могу поверить, что ответ был таким простым, большое вам спасибо. Что касается приведений, я знаю, что это выглядит странно, но без них значения будут перепутаны