1

我正在做一个matlab作业,我解决了下一个问题。并且评分员说这是一个正确的答案。我在课程中使用过,但我们还没有参加课程。有人可以建议一个没有 for 或 if 的程序。

编写一个名为pitty 的函数,它将一个名为ab 的矩阵作为输入参数。矩阵 ab 正好有两列。该函数应返回包含正值的列向量 c,其中每个正值都满足 ab 的相应行的勾股定理 a2 + b2 = c2,假设 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

3 回答 3

4

您可以使用运算符对矩阵的每个元素进行平方.^2。然后沿每一行求和sum(...,2),最后求根。

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

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

不需要for

于 2015-05-07T07:15:15.470 回答
3

MATLAB 有一个函数,称为斜边hypot的缩写。它存在的主要原因是它处理溢出(和下溢)问题。如果输入值太大(或太小),它们的平方(或它们的平方和)可以大于(小于)浮点中的最大(最小)可表示值,而相应的值仍然是可表示的。在您的情况下,您可以像这样使用它:c

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

MathWorks 的创始人之一和 MATLAB 的原作者 Cleve Molerhypot本文中讲述了背后的故事。

于 2015-05-07T08:24:40.510 回答
1

我会推荐Mohsen 的hypot回答。

只是为了一些变化,这里有另一种方法,使用复数。这种方法避免了溢出和下溢,就像这样hypot

abs(ab*[1; 1j])

示例(取自Cleve Moler 的帖子):

>> 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
于 2015-05-07T09:07:38.280 回答