Matlab to Python - Матрица / формирование массива и операции

1

Я работаю над переводом некоторого кода 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 для меня было довольно сложным. Спасибо.

Теги:
translate

2 ответа

2

Я буду использовать некоторые фиктивные значения и попытаюсь четко объяснить, что происходит в коде. Кроме того, я определенно не эксперт в 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)); имеет несколько вещей, происходящих сразу, поэтому давайте работать через него шаг за шагом.

  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 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 и трюки

2

Для линии 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-ю строки?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню