Я работаю над переводом некоторого кода 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));
Я понимаю первые две строки (создаю n + 1 на n + 1 матрицу S), но у меня возникли проблемы с пониманием следующих 3.
Из того, что я понимаю (n:m)
является нотация Matrix. Таким образом, S(1, 1)
означает значение в первой строке, первом столбце, которая установлена в 1/math.sqrt(b[0])
в терминах Python. Это будет означать, что в нашей матрице S первая строка представляет собой массив, который 1/math.sqrt(b[0])
, а остальные - 0, правильно?
Для 4-й линии у меня возникают реальные проблемы с пониманием водки. Мы говорим, что вторая строка является первой строкой минус массив от 0 до a(1)*S(1,1:end-1)
? Что именно означает a(1)*S(1,1:end-1)
?
Я вижу, что следующие 2 строки являются рекуррентным отношением, основанным на j-1-й и j-2-й строках для некоторого j> = 3 (2, если Python), но у меня мало информации о том, что вычисляет отношение рецидивов.
Любая помощь, "переводимая" этот код в Python (с точки зрения псевдокода для понимания, а не фактического жесткого кода), была бы чрезвычайно полезна, поскольку изучение MATLAB для меня было довольно сложным. Спасибо.
Я буду использовать некоторые фиктивные значения и попытаюсь четко объяснить, что происходит в коде. Кроме того, я определенно не эксперт в Matlab, и мои знания об этом регулируются на первый курс программирования в университете, поэтому я беру то, что пишу с солью!
Определим:
a = [1,2,3,4]
b = [1,2,3,4]
Да, строка три S(1,1) = sqrt(1/b(1));
действительно приведет к следующему массиву, где значение (0,0)
в python равно 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
Строка 4 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
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
Строки 5 и 6 аналогичны строкам 4, но с некоторыми изменениями, которым манипулируют индексы.
Это не псевдокод, как вы просили, но я надеюсь, что мой ответ поможет вам в определенной степени. Пока вы работаете над этим, вы можете проверить эту статью, которую я нашел довольно полезной для понимания массивов в Matlab
Для линии 3 вы правы!
Для строки 4 a(1)*S(1,1:end-1)
означает a(1)
раз список, который состоит из 1-го по последний 2-й элемент S(1,:)
. Например, если S(1,:) = [1, 2, 3, 4, 5]
то a(1)*S(1,1:end-1)
означает a(1)*[1, 2, 3, 4]
. Вы можете думать, что end-1
эквивалентен len(S[0]) - 1
в python. Перевод строки 4 в python:
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-ю строки?