Понимание Python for-loop на начальном уровне - PullRequest
1 голос
/ 23 февраля 2020

Я понимаю, что многие из этих вопросов уже задавались ранее, но я не могу найти ответы для себя.

Я довольно свободно говорю в Matlab, но не могу понять эти Python for-loop. Я написал этот небольшой скрипт в Matlab, и я хочу сделать то же самое в Python.

Matlab

h = 2;
w = pi / 2;
t = 0:.01:4;
smP = [1 2]';
r = [h * cos(w * t') 2 * h * sin(w * t')]';
A = zeros(2,2,length(t));
rP = zeros(2,length(t));
for i = 1:length(t)
    A(:,:,i) = [cos(w * t(i)) -sin(w * t(i)); sin(w * t(i)) cos(w * t(i))];
    rP(:,i) = r(:,i) + A(:,:,i) * smP;
end
plot(rP(1,:),rP(2,:))

Я не могу получить * Индексирование в стиле 1010 * для работы в Python. Я попробовал несколько вещей.

Попытка 1

r = np.matrix([h * np.cos(w * t), 2 * h * np.sin(w * t)])
A = np.array([[np.cos(w * t), -np.sin(w * t)], [np.sin(w * t), np.cos(w * t)]])

rP = []
for i in range(len(t)):
    instant = r[:,i] + A[:,:,i] @ smP
    rP.append(instant)

Попытка 2

rP = np.zeros([2,len(t)])
for i in range(len(t)):
    rP[:][i] = r[:,i] + A[:,:,i] @ smP

Это дает мне список 400 (с моим текущим размером t), который содержит вектор 2x1 в каждом индексе. Это я не могу построить, и это просто плохой способ сохранить мои данные. Очевидно, я хочу матрицу 2xlength (t), где каждый столбец является вектором rP с дискретными временными шагами (точно так же, как код Matlab).

Как я могу выполнить sh эту простую вещь в Python?

1 Ответ

0 голосов
/ 23 февраля 2020

Проверьте следующее решение:

import numpy as np
from matplotlib import pyplot as plt
from numpy import sin, cos, hstack, vstack

h = 2
w = np.pi / 2
t = np.arange(0, 4+0.01, 0.01) # t = 0:.01:4;
smP = np.array((1, 2)) # smP = [1 2]';
r = vstack((h * cos(w * t), 2 * h * sin(w * t))) #r = [h * cos(w * t') 2 * h * sin(w * t')]';
A = np.zeros((2, 2, len(t))) #A = zeros(2,2,length(t));
rP = np.zeros((2, len(t))) #rP = zeros(2,length(t));

for i in range(len(t)):  #for i = 1:length(t)
    A[:,:,i] = vstack((hstack((cos(w * t[i]), -sin(w * t[i]))), hstack((sin(w * t[i]), cos(w * t[i]))))) #    A(:,:,i) = [cos(w * t(i)) -sin(w * t(i)); sin(w * t(i)) cos(w * t(i))];
    rP[:,i] = r[:,i] + A[:,:,i].dot(smP.T)  #    rP(:,i) = r(:,i) + A(:,:,i) * smP;

plt.plot(rP[0,:], rP[1,:])  #plot(rP(1,:),rP(2,:))
plt.show(block=True)

Обратите внимание, что мой уровень Python не такой хороший ...

...