【问题标题】:Matlab to Python - Matrix/Array Formation and OperationsMatlab 到 Python - 矩阵/数组的形成和运算
【发布时间】:2019-04-01 07:34:01
【问题描述】:

我正在努力将一些 MATLAB 代码翻译成 Python,这样我就可以更好地学习 MATLAB(尝试先从 Python 的角度思考),但我对这段代码的作用感到有些困惑。

n = length(a);
S = zeros(n+1,n+1);
S(1,1) = sqrt(1/b(1));
S(2,:) = (S(1,:)-[0,a(1)*S(1,1:end-1)])/sqrt(b(2));
S(3,:) = (S(2,:)-[0,a(2)*S(2,1:end-1)]-[0,0,sqrt(b(2))*S(1,1:end-2)])/sqrt(b(3));
S(4,:) = (S(3,:)-[0,a(3)*S(3,1:end-1)]-[0,0,sqrt(b(3))*S(2,1:end-2)])/sqrt(b(4));

我理解前 2 行(创建一个 n+1 乘 n+1 矩阵 S),但我无法理解接下来的 3 行。

据我了解(n:m) 是矩阵查找符号。所以,S(1, 1) 表示第一行第一列的值,在 Python 中设置为1/math.sqrt(b[0])。这意味着在我们的矩阵 S 中,第一行是数组 who 1/math.sqrt(b[0]),其余的都是 0,对吧?

对于第 4 行,我很难理解 vode。我们是说第二行是第一行减去从 0 到 a(1)*S(1,1:end-1) 的数组吗? a(1)*S(1,1:end-1) 在这里究竟代表什么?

我看到接下来的 2 行是基于 j >= 3 的第 j-1 行和第 j-2 行的递归关系(如果是 Python,则为 2),但我对递归关系计算的内容知之甚少.

任何将这段代码“翻译”成 Python 的帮助(就理解的伪代码而言,而不是实际的硬代码)都会非常有帮助,因为到目前为止学习 MATLAB 对我来说非常棘手。谢谢。

【问题讨论】:

    标签: python matlab translate


    【解决方案1】:

    我将使用一些虚拟值并尝试清楚地解释代码中发生了什么。另外,我绝对不是 matlab 方面的专家,我对它的了解仅限于大学一年级的编程课程,所以一定要对我写的内容持保留态度!

    让我们定义:

    a = [1,2,3,4]
    b = [1,2,3,4]
    

    是的,第三行 S(1,1) = sqrt(1/b(1)); 确实会产生以下数组,其中 python 中 (0,0) 的值是 1 除以列表 b 或 math.sqrt(1/b[0]) 中的第一个值的平方根,就像你定义的那样。

    1 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    

    第四行S(2,:) = (S(1,:)-[0,a(1)*S(1,1:end-1)])/sqrt(b(2)); 有几件事情同时进行,所以让我们一步一步来。

    1. S(1,:) 指的是数组 S 的整个第一行。
    2. a(1)*S(1,1:end-1) 是一个数组,它是数组的第一项 a(1) = 1 乘以数组 S 的第一行直到第二行 行中的最后一项 S(1,1:end-1) = 1 0 0 0
    3. [0,a(1)*S(1,1:end-1)] 是一个数组,其中第一项为 0,而 第二项是数组a(1)*S(1,1:end-1)。因此[0,a(1)*S(1,1:end-1)] = 0 1 0 0 0
    4. S(1,:)-[0,a(1)*S(1,1:end-1)] 只是将数组S(1,:) = 1 0 0 0 0 的整个第一行减去数组[0,a(1)*S(1,1:end-1)] = 0 1 0 0 0,这给了我们1 -1 0 0 0
    5. 最后我们将所有内容除以sqrt(b(2)) = 1.4142
    6. 这给了我们 S(2,:) = 0.7071 -0.7071 0 0 0

    第 5 行和第 6 行与第 4 行类似,但对正在操作的索引进行了一些更改。

    这不是您要求的伪代码,但我希望我的回答在一定程度上对您有所帮助。当你在做这个的时候,你可能想看看这篇论文,我发现它对理解 Matlab 中的数组很有帮助

    MATLAB array manipulation tips and tricks

    【讨论】:

      【解决方案2】:

      对于第 3 行,你是对的!

      对于第 4 行,a(1)*S(1,1:end-1) 表示 a(1) 乘以由 S(1,:) 的第一个到最后一个第二个元素组成的列表。例如,如果S(1,:) = [1, 2, 3, 4, 5]a(1)*S(1,1:end-1) 表示a(1)*[1, 2, 3, 4]。你可以认为end-1相当于python中的len(S[0]) - 1。 python中第4行的翻译是:

      temp = [0] + [a[0]*i for i in S[0][0:-1]]
      for i in range(len(S[0])):
         S[1][i] = (S[0][i] - temp[i]) / math.sqrt(b[1])
      

      根据第4行,可以翻译第5行和第6行吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-13
        • 2022-11-02
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        相关资源
        最近更新 更多