#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. Это работает отлично! Я не могу поверить, что ответ был таким простым, большое вам спасибо. Что касается приведений, я знаю, что это выглядит странно, но без них значения будут перепутаны