2015-03-01 2 views
0

Для изображения I и двух матриц m_1; m_2 (такого же размера с I). Функция f определяется как: enter image description here Потому что мой дизайн цели хочет получить знак f. Следовательно, функция F может переписать следующим образом: enter image description hereСамый быстрый способ найти знак разного квадрата

  • Я думаю, что вторая формула быстрее, чем первая формула, потому что: Он может игнорировать квадратный термин
  • Он может вычислить знак непосредственно, вместо двух шаги в первом уравнении: вычислите знак f и check.

Вы согласны со мной? Есть ли у вас еще быстрее формулы для F

I =[16 23 11 42 10 
    11 21 22 24 30 
    16 22 154 155 156 
    25 28 145 151 156 
    11 38 147 144 153]; 

m1 =[0  0  0  0  0 
    0  0 22 11  0 
    0 23 34 56  0 
    0 56  0  0  0 
    0 11  0  0  0]; 

m2 =[0  0  0  0  0 
    0  0 12 11  0 
    0 22 111 156  0 
    0 32  0  0  0 
    0 12  0  0  0]; 

вывод е является

f =[1  1  1  1  1 
    1  1 -1  1  1 
    1  1  1  1  1 
    1  1  1  1  1 
    1  1  1  1  1] 

Я осуществил первый путь, но я не закончил второй путь по MATLAB. Не могли бы вы проверить, пожалуйста, второй способ и сравнить его?

UPDATE: Я хотел бы добавить код chepyle и Divakar, чтобы задать вопрос. Обратите внимание, что оба они дают тот же результат, как и выше е

function compare() 
I =[16 23 11 42 10 
    11 21 22 24 30 
    16 22 154 155 156 
    25 28 145 151 156 
    11 38 147 144 153]; 

m1 =[0  0  0  0  0 
    0  0 22 11  0 
    0 23 34 56  0 
    0 56  0  0  0 
    0 11  0  0  0]; 

m2 =[0  0  0  0  0 
    0  0 12 11  0 
    0 22 111 156  0 
    0 32  0  0  0 
    0 12  0  0  0]; 

    function f=first_way() 
     f=sign((I-m1).^2-(I-m2).^2); 
     f(f==0)=1; 

    end 

    function f= second_way() 
     f = double(abs(I-m1) >= abs(I-m2)); 
     f(f==0) = -1; 

    end 

    function f= third_way() 
     v1=abs(I-m1); 
     v2=abs(I-m2); 
     f= int8(v1>v2) + -1*int8(v1<v2); % need to convert to int from logical 
     f(f==0) = 1; 

    end 

disp(['First way : ' num2str(timeit(@first_way))]) 
disp(['Second way: ' num2str(timeit(@second_way))]) 
disp(['Third way : ' num2str(timeit(@third_way))]) 

end 

First way : 1.2897e-05 Second way: 1.9381e-05 Third way : 2.0077e-05

+1

Я не думаю, что ваша вторая формула верна, так как квадратные условия изменит знак 'v_i (х, у) '- если вы не знаете,' I> = m_i' или что-то в этом роде. – aganders3

+0

Что именно вы ищете? Первое уравнение или второе уравнение, которое когерентно с названием вопроса, но не совпадает с первым уравнением? – Divakar

+0

@Divakar и angdaers3: Извините, я ошибаюсь во втором уравнении. Я обновляю его. Позвольте проверить его снова. Моя цель - проверить знак уравнения f в уравнении 1 самым быстрым способом.Потому что мы рассматриваем только знак f без его реального значения, следовательно, мы можем переформулировать, чтобы быстро вычислить время. – john2182

ответ

3

Это, кажется, сопоставимыми и может быть чуть-чуть быстрее в разы, чем оригинальный подход -

f = sign(abs(I-m1) - abs(I-m2)) + sign(abs(m1-m2)) + ... 
    sign(abs(2*I-m1-m2)) - 1 -sign(abs(2*I-m1-m2) + abs(m1-m2)) 

Бенчмаркинг кодекса

%// Create random inputs 
N = 5000; 
I = randi(1000,N,N); 
m1 = randi(1000,N,N); 
m2 = randi(1000,N,N); 

num_iter = 20; %// Number of iterations for all approaches 

%// Warm up tic/toc. 
for k = 1:100000 
    tic(); elapsed = toc(); 
end 

disp('------------------------- With Original Approach') 
tic 
for iter = 1:num_iter 
    out1 = sign((I-m1).^2-(I-m2).^2); 
    out1(out1==0)=-1; 
end 
toc, clear out1 

disp('------------------------- With Proposed Approach') 
tic 
for iter = 1:num_iter  
    out2 = sign(abs(I-m1) - abs(I-m2)) + sign(abs(m1-m2)) + ... 
      sign(abs(2*I-m1-m2)) - 1 -sign(abs(2*I-m1-m2) + abs(m1-m2));  
end 
toc 

Результаты

------------------------- With Original Approach 
Elapsed time is 1.751966 seconds. 
------------------------- With Proposed Approach 
Elapsed time is 1.681263 seconds. 
+0

Спасибо Дивакар. Я сравниваю первый и второй варианты с вашей реализацией и chepyle. Однако самый быстрый способ - это первый путь. Почему это быстрее, хотя он должен вычислять квадратный результат. – john2182

+0

@ john2182 Если в первом случае вы имеете в виду 'sign ((I-m1).^2- (I-m2).^2)', то это дает вам неправильный результат, правильно? Кроме того, убедитесь, что вы выбрали достаточно большие данные для того времени! С помощью этих небольших данных вы не сможете правильно судить о своих выступлениях! – Divakar

+0

№. Первый способ и второй способ дают тот же результат. Первый способ вычисляет результат f, а затем проверяет его знак. Однако он должен вычислить квадрат матрицы. Для второго пути мы можем вычислить знак f без квадрата матрицы. С моим наблюдением второй путь должен быть быстрее. Но Matlab показал, что он медленнее, чем первый способ. – john2182

3

Существует проблема с точностью второй формулы, но для сравнения, вот как я бы реализовать его в MATLAB , наряду с третьим подходом, чтобы избежать возведения в квадрат и функции sign(), в соответствии с вашими намерениями. Обратите внимание, что матричные и знаковые функции Matlab довольно хорошо оптимизированы, второй и третий подходы медленнее.

function compare() 
I =[16 23 11 42 10 
    11 21 22 24 30 
    16 22 154 155 156 
    25 28 145 151 156 
    11 38 147 144 153]; 

m1 =[0  0  0  0  0 
    0  0 22 11  0 
    0 23 34 56  0 
    0 56  0  0  0 
    0 11  0  0  0]; 

m2 =[0  0  0  0  0 
    0  0 12 11  0 
    0 22 111 156  0 
    0 32  0  0  0 
    0 12  0  0  0]; 

    function f=first_way() 
     f=sign((I-m1).^2-(I-m2).^2); 
    end 

    function f= second_way() 
     v1=(I-m1); 
     v2=(I-m2); 
     f= int8(v1<=0 & v2>0) + -1* int8(v1>0 & v2<=0); 
    end 

    function f= third_way() 
     v1=abs(I-m1); 
     v2=abs(I-m2); 
     f= int8(v1>v2) + -1*int8(v1<v2); % need to convert to int from logical 
    end 

disp(['First way : ' num2str(timeit(@first_way))]) 
disp(['Second way: ' num2str(timeit(@second_way))]) 
disp(['Third way : ' num2str(timeit(@third_way))]) 

end 

Выход:

First way : 9.4226e-06 
Second way: 1.2247e-05 
Third way : 1.1546e-05 
+0

, кажется, что вы работаете с обработкой изображений. Не могли бы вы помочь нам открыть эту выделенную группу: area51.stackexchange.com/proposals/66531/computer-vision/72084 Просто голосуйте на вопросы с меньшими чем 10 голосов. Благодарю. – Royi