LINUX.ORG.RU

[octave][оптимизация]Как бы сделать?

 ,


0

1

Есть примерно такой код:

#!/usr/bin/octave
load ("canny_res.mat","dc");
load ("test.mat", "c");
load ("primary.mat","xl");
%a=a(:,125:202);
%dc=dc(:,125:202);
for k=1:size (c,1)
 for l=1:size (c,2)
 if (dc (k,l) == 0)
  x(k,l,1)=c (k,l);
  x(k,l,2)=c (k,l);
  x(k,l,3)=c (k,l);
 else
   if (xl (k,l) == 0)
   x(k,l,1)=1;
   x(k,l,2)=0;
   x(k,l,3)=0;
   else
   x(k,l,1)=0;
   x(k,l,2)=1;
   x(k,l,3)=0;
  end;
 end;
end;
end;
x=x/max(max(max(x)));
imwrite (x,"lines.bmp");
Матрицы dc, c и xl, естественно, имеют одинаковый размер.
Как бы этот код сделать по-шустрее методами октавы или матлаба?

★★★★★

Octave, как и матлаб, использует матричные вычисления. А вы ими не пользуетесь, зачем-то используя циклы.

  1. Создаем нулевые матрицы R, G и B размера size(c);
  2. Заполняем серым: idx = find(dc == 0); R(idx)=G(idx)=B(idx)=c(idx);
  3. Заполняем красным: R(find(xl == 0)) = 1;
  4. Заполняем зеленым: G(find(xl != 0)) = 1;
  5. Нормализуем
  6. Готово
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

>Octave, как и матлаб, использует матричные вычисления

Дык вот я же не всё знаю. Нас научили только складывать, умножать, транспонировать, брать детерминанты и т.д. А вот find я пока не освоил. Спасибо.

luke ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

В общем, вот это: [code lang=«octave»] for k=1:size (c,1) for l=1:size (c,2) if (dc (k,l) == 0) x(k,l,1)=c (k,l); x(k,l,2)=c (k,l); x(k,l,3)=c (k,l); else if (xl (k,l) == 0) x(k,l,1)=1; x(k,l,2)=0; x(k,l,3)=0; else x(k,l,1)=0; x(k,l,2)=1; x(k,l,3)=0; endif; endif; end; end; Заменяем на это: [code lang=«octave»] R = zeros(size(c)); idx = find(dc == 0); R(idx)=c(idx); G = R; B = R; R(find(xl == 0)) = 1; G(find(xl != 0)) = 1;

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

В общем, вот это:

for k=1:size (c,1)
 for l=1:size (c,2)
 if (dc (k,l) == 0)
  x(k,l,1)=c (k,l);
  x(k,l,2)=c (k,l);
  x(k,l,3)=c (k,l);
 else
   if (xl (k,l) == 0)
   x(k,l,1)=1;
   x(k,l,2)=0;
   x(k,l,3)=0;
   else
   x(k,l,1)=0;
   x(k,l,2)=1;
   x(k,l,3)=0;
  endif;
 endif;
end;
end;
Заменяем на это:
R = zeros(size(c));
idx = find(dc == 0);
R(idx)=c(idx);
G = R; B = R;
R(find(xl == 0)) = 1; 
G(find(xl != 0)) = 1;

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от luke

Да я и сам по-привычке (с ЖЖ) оформил, как тег <code lang=«…»>

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em
x(:,:,1) = zeros(size(c)); idx = find(dc == 0); x(idx,1)=c(idx); x(idx,2) = x(idx,1); x (idx,3) = x(idx,1); x(find(xl!=0),2) = 1; x(find((dc != 0)&&(xl==0)),1) = 1; 

Скорее так уж.

luke ★★★★★
() автор топика
Ответ на: комментарий от luke

Можно и так. А можно было оформить в конце x слиянием матриц R, G и B.

Без разницы. Возможно, мой способ даже быстрее будет.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Стараюсь экономить память.

luke ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.