我正在努力将一些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一直很棘手。谢谢。
答案 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));
一次发生了几件事情,因此让我们逐步进行一下工作。
S(1,:)
指向数组S的整个第一行。a(1)*S(1,1:end-1)
是一个数组,它是数组的第一项
a(1) = 1
乘以数组S的第一行直到第二行
S(1,1:end-1) = 1 0 0 0
行中的最后一项。[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
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
sqrt(b(2)) = 1.4142
0.7071 -0.7071 0 0 0
第五行和第六行与第四行相似,但是对索引的操纵有所改变。
这不是您要求的伪代码,但我希望我的回答可以在某种程度上对您有所帮助。在您进行此工作时,您可能想查看一下这篇论文,该论文对理解Matlab中的数组很有帮助
答案 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行吗?