我知道以前有人问过很多这样的问题,但我似乎找不到自己的答案。
我对Matlab相当流利,但我不能理解这些Python for循环。我已经在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,:))
我无法在Python中使用rP(:,i)
样式的索引。我试过一些东西。
尝试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代码一样(。
如何在Python中完成这件简单的事情?
检查以下解决方案:
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级别不是那个等级。。。