2013-02-11 5 views
-1

Я написал функцию, которая должна сделать следующее:Matlab - Не получив ожидаемого результата

  • Возьмем в качестве входа два набора
  • Возьмите расстояние между двумя наборами, используя pdist2 код которого показаны here.
  • Это займет расстояние между двумя наборами в начале. Затем для второго установите на каждой итерации значение (i, j) на 0 и вычислите расстояние с этим изменением. An, когда он переходит к следующей итерации, он должен изменить следующее значение местоположения на «0», в то же время вернуть предыдущее значение, которое было установлено на «0», на его исходное значение .
  • Обратите внимание, что результат от pdist2 первоначально возвращается как матрица, но для сравнения я суммирую значения матрицы, чтобы использовать их для сравнения.

Исходя из этого, я написал следующую функцию (обратите внимание, что вы можете использовать функцию pdist2.m по ссылке here):

function m = pixel_minimize_distance(x,y) 
    sum1=0; 
    sum2=0; 
    [r c] = size(y); 
    d1 = pdist2(x,y); 
    [r1 c1] = size(d1); 
    for i=1:r1 
    for j=1:c1 
     sum1=sum1+d1(i,j); 
    end 
end 
maximum = sum1; 

for i=1:r 
for j=1:c 
o = y(i,j) 
y(i,j) = 0; 
d2 = pdist2(x,y); 
[r2 c2] = size(d2); 
for i=1:r2 
    for j=1:c2 
     sum2=sum2+d2(i,j); 
    end 
end 

if sum2 >= maximum 
    if o ~= 0 
    maximum = sum2; 
    m = o; 
    end 

end 

if sum2 <= maximum 
maximum = maximum; 
end 
y(i,j)=o; 
end 
end 
end 

Теперь, это то, что я работать в качестве теста:

>> A=[1 2 3; 6 5 4]; 
>> B=[4 5 3; 7 8 1]; 
>> pixel_minimize_distance(A,B) 

o = 

    4 


o = 

    4 


o = 

    1 


o = 

    7 


o = 

    7 


o = 

    0 


ans = 

    7 

Смотрите ответ здесь 7 (прокрутите вниз, если вы не можете увидеть его), в то время как ожидаемое значение, когда я вычислить это вручную должен быть 3 как SINC e, когда мы установили его на 0, сумма расстояния будет 142.

Любая идея, что может быть неправильным в коде? Я думаю, что это было бы в месте установки кода o = y(i,j), где o обозначает оригинальное значение, но на самом деле не могло понять способ решения этого.

Спасибо.

+1

У вас есть 'end', который не имеет соответствующего' for' – ogzd

+0

@ogzd. Я думаю, вы имеете в виду последний «конец», который для функции. Кажется, в моем посте первые несколько строк не отображались, но теперь изменили мой код. Спасибо – Simplicity

+0

Не могли бы вы поместить комментарии в код с '%', так как не совсем ясно, какая часть должна делать то, что. Также попробуйте пройти через код, пока не увидите что-то странное с f10. –

ответ

2

Я думаю, у вас в коде много избыточных команд. Я просто удалил их, ничего больше. Я получаю значение m как 3. Я использовал функцию MATLAB pdist2 с квадратичным эвклидовым расстоянием (поскольку это значение по умолчанию в предоставленной вами функции). Я не получил 142 расстояния.

Вот код:

function m = pixel_minimize_distance(x,y) 
[r c] = size(y); 
maximum = (sum(sum(pdist2(x,y)))).^2; %explained below 

for i=1:r 
    for j=1:c 
     o = y(i,j); 
     y(i,j) = 0 
     sum2 = (sum(sum(pdist2(x,y)))).^2; 


     if sum2 >= maximum 
      if o ~= 0 
       maximum = sum2; 
       m = o; 
      end 
     end 

     y(i,j)=o; 
    end 
end 
end 

и выход:

у =

0  5  3 
7  8  1 

у =

4  0  3 
7  8  1 

у =

4  5  0 
7  8  1 

у =

4  5  3 
0  8  1 

у =

4  5  3 
7  0  1 

у =

4  5  3 
7  8  0 

м =

3 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Объяснение: Вы написали следующий фрагмент кода:

d2 = pdist2(x,y); 
[r2 c2] = size(d2); 
for i=1:r2 
    for j=1:c2 
     sum2=sum2+d2(i,j); 
    end 
end 

, что это просто делает вычисляет расстояние между двумя наборами с помощью pdist2 и суммирует всю матрицу расстояния, чтобы прийти с одним значением, хранящимся в sum2 в вашем случае. Давайте посмотрим на мой код:

sum2 = (sum(sum(pdist2(x,y)))).^2; 

pdist2 даст расстояние. Первая команда sum будет суммировать по строкам, а затем вторая будет суммировать по столбцам, чтобы дать вам общее количество всех значений в матрице (это то, что вы сделали с двумя циклами for). Теперь, причина .^2 является: В оригинальной pdist2 функции в ссылке, которую вы предоставили, вы можете видеть из следующего фрагмента кода:

if(nargin<3 || isempty(metric)); metric=0; end; 

switch metric 
    case {0,'sqeuclidean'} 

, что квадрат евклидова расстояния по умолчанию, в то время как в среде MATLAB , Эвклидово расстояние по умолчанию. Поэтому я сформулировал этот термин. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %

+0

Ницца, код действительно может использовать некоторую очистку! Хотя вы, очевидно, что-то изменили, поскольку исходный код даст 7, даже с настройкой по умолчанию. Я предполагаю, что в оригинале была ошибка. –

+0

@Parag. Спасибо за ваш ответ. Можете ли вы просто объяснить мне, что? (Sum (sum (pdist2 (x, y)))).^2; 'означает? Что такое «.^2»? – Simplicity

+1

Вместо сравнения суммы с максимумом он сравнивает квадраты, возможно, здесь не требуется, но в целом это гарантирует, что вы не удивляетесь отрицательным значениям. –

Смежные вопросы