Matlab至Python-矩阵/数组的形成和运算

时间:2018-10-28 00:21:09

标签: python matlab translate

我正在努力将一些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创建n + 1矩阵S),但是在理解下3行时遇到了麻烦。

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

对于第四行,我在理解该视频时确实遇到了麻烦。我们是说第二行是第一行减去从0到a(1)*S(1,1:end-1)的数组吗? a(1)*S(1,1:end-1)在这里到底代表什么?

我看到接下来的两行是基于j的第j-1行和第j-2的行的递归关系,其中j> = 3(如果是Python,则为2),但是对于递归关系正在计算什么我几乎一无所知。

任何帮助将这段代码“翻译”为Python(就理解的伪代码而言,而不是实际的硬代码)都将大有帮助,因为到目前为止,学习MATLAB一直很棘手。谢谢。

2 个答案:

答案 0 :(得分:3)

我将使用一些虚拟值,并尝试清楚地解释代码中发生了什么。另外,我绝对不是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 array manipulation tips and tricks

答案 1 :(得分: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行吗?