Matlab to Python - 矩阵/数组的形成和操作



我正在努力将一些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 矩阵 S 创建一个 n+1),但我无法理解接下来的 3 行。

据我了解(n:m)是矩阵查找表示法。因此,S(1, 1)表示第一行第一列的值,该值设置为 Python 的1/math.sqrt(b[0])。这意味着在我们的矩阵 S 中,第一行是一个数组谁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-1th 和 j-2th 行的递归关系,对于某些 j>= 3(如果是 Python 为 2),但我对递归关系计算的内容知之甚少。

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

我将使用一些虚拟值,并尝试清楚地解释代码中发生的事情。此外,我绝对不是 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

第五行和第六行与第四行类似,但对正在操作的索引进行了一些更改。

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

MATLAB 数组操作提示和技巧

对于第 3 行,你是对的!

对于第 4 行,a(1)*S(1,1:end-1)表示a(1)乘以由S(1,:)的第 1 个到最后一个第 2 个元素组成的列表。例如,如果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 行吗?

最新更新