【问题标题】:matlab Pythagorean Theorem without using formatlab勾股定理不使用for
【发布时间】:2015-05-07 07:09:50
【问题描述】:

我正在做一个 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   

【问题讨论】:

    标签: matlab pythagorean


    【解决方案1】:

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

    ab = [1,2;3,4;5,6]
    
    c = sqrt(sum(ab.^2,2));
    

    不需要for

    【讨论】:

      【解决方案2】:

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

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

      MathWorks 的创始人之一和 MATLAB 的原作者 Cleve Moler 讲述了 hypotin this article 背后的故事。

      【讨论】:

        【解决方案3】:

        我会推荐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
        

        【讨论】:

        • 似乎有人(downvoter)不喜欢这个任务的复数:-) 也许我应该补充一点,这可能不是首选方法;我只是想提供一些替代方案。但请注意,它确实避免了溢出,就像hypot 一样。我已编辑我的答案以包含此信息
        • 有趣。我原以为复数的abs 将是文档中所写的简单sqrt(real(X).^2 + imag(X).^2) ......但似乎它们也包括溢出保护。
        猜你喜欢
        • 2015-07-23
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        • 2013-02-13
        • 2019-10-08
        • 1970-01-01
        相关资源
        最近更新 更多