2015-05-07 6 views
1

Я занимаюсь домашней работой в Matlab, и я решил следующую проблему. и грейдер говорит, что это правильный ответ. Я использовал в программе, и мы еще не принимали участие в этом курсе. может кто-то предложить программу без или для.matlab Pythagorean Теорема без использования для

Напишите функцию, называемую pitty, которая принимает матрицу с именем ab в качестве входного аргумента. Матрица ab имеет ровно два столбца. Функция должна возвращать вектор-столбец c, который содержит положительные значения, каждый из которых удовлетворяет теореме Пифагора, a2 + b2 = c2, для соответствующей строки ab, предполагающей, что два элемента на каждой строке ab соответствуют одной паре, a и b , соответственно, в теореме. Обратите внимание, что встроенная функция MATLAB sqrt вычисляет квадратный корень, и вам разрешено использовать его.

мой код

function c = pitty(ab) 
    [n , m] = size(ab) 
    for i = 1:n 
     c(i) = sqrt(ab(i,1)^2 + ab(i,2)^2)  
    end 
    c = c' 
end 

ответ

4

Вы можете квадрат каждый элемент матрицы с помощью оператора .^2. Затем суммируем по каждой строке sum(...,2) и, наконец, берем корень.

ab = [1,2;3,4;5,6] 

c = sqrt(sum(ab.^2,2)); 

No for, необходимый для этого.

3

У MATLAB есть функция для этого: hypot short for hypotenuse. Основной причиной его существования является то, что он заботится о проблеме переполнения (и недоиспользования). Если входные значения слишком велики (или малы), их квадрат (или сумма квадрата) может быть больше (меньше), чем наибольшее (наименьшее) представимое значение в плавающей точке, в то время как все же соответствующее значение c представляется , В вашем случае вы можете использовать его как это:

c=hypot(ab(:,1), ab(:,2)); 

Клив Moler, один из основателей MathWorks и оригинального автора MATLAB, рассказывает историю позади hypot в this article.

1

Я бы рекомендовал hypot как в Mohsen's answer.

Просто для некоторого разнообразия, вот еще один подход, используя комплексные числа. Такой подход позволяет избежать переполнения и сгущенного, так же, как hypot делает:

abs(ab*[1; 1j]) 

Примеры (взяты из Cleve Moler's post):

>> ab = [1e154 1e154];  %// LARGE VALUES: possible overflow 
>> sqrt(sum(ab.^2,2)) 
ans = 
    Inf      %// overflow 
>> hypot(ab(:,1), ab(:,2)) 
ans = 
    1.414213562373095e+154 %// correct result 
>> abs(ab*[1; 1j]) 
ans = 
    1.414213562373095e+154 %// correct result 

>> ab = [3e-200 4e-200];  %// SMALL VALUES: possible underflow 
>> sqrt(sum(ab.^2,2)) 
ans = 
    0      %// underflow 
>> hypot(ab(:,1), ab(:,2)) 
ans = 
    5.000000000000000e-200 %// correct result 
>> abs(ab*[1; 1j]) 
ans = 
    5.000000000000000e-200 %// correct result 
+0

Похоже, кто-то (downvoter) не любит комплексные числа для решения этой задачи :-) Возможно, я должен добавить, что это, вероятно, не самый предпочтительный подход; Я просто хотел предоставить альтернативу. Но обратите внимание, что он избегает переполнения, как «hypot». Я отредактировал свой ответ, чтобы включить эту информацию. –

+1

Интересно. Я бы подумал, что 'abs' сложного числа будет простым' sqrt (real (X).^2 + imag (X).^2) 'как написано в документе ... но кажется, что они включали переполнение там тоже. – Hoki