Matlab to Python - Матрица / формирование массива и операции - PullRequest
0 голосов
/ 28 октября 2018

Я работаю над переводом некоторого кода 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 S), но у меня возникают проблемы с пониманием следующих 3.

Из того, что я понимаю(n:m) - матричная поисковая запись.Таким образом, S(1, 1) означает значение в 1-й строке первого столбца, которое установлено на 1/math.sqrt(b[0]) в терминах Python.Это означало бы, что в нашей матрице S первая строка - это массив, который 1/math.sqrt(b[0]), а остальные - 0, верно?

Для 4-й строки у меня действительно возникают проблемы с пониманием vode.Мы говорим, что 2-я строка - это 1-я строка без массива от 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 для меня было довольно сложно до сих пор.Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

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

В четвертой строке S(2,:) = (S(1,:)-[0,a(1)*S(1,1:end-1)])/sqrt(b(2)); происходит несколько вещей одновременно, поэтому давайте разберемся с этим шаг за шагом.

  1. S(1,:) относится ко всей 1-й строкемассива S.
  2. a(1)*S(1,1:end-1) - это массив, в котором это первый элемент массива a(1) = 1, умноженный на 1-ю строку массива S до второго последнего элемента в строке S(1,1:end-1) = 1 0 0 0.
  3. [0,a(1)*S(1,1:end-1)] - это массив, в котором 1-й элемент равен 0, а 2-й элемент - это массив 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

0 голосов
/ 28 октября 2018

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

...