将本征矩阵转换为numpy矩阵 我在C++中使用下面的代码,使用特征库,需要帮助翻译到python(NoMPY)
初始化将本征矩阵转换为numpy矩阵 我在C++中使用下面的代码,使用特征库,需要帮助翻译到python(NoMPY),python,c++,numpy,eigen,code-conversion,Python,C++,Numpy,Eigen,Code Conversion,初始化 double b = 20.0; Eigen::Vector3d C(1.0/10.2, 1.0/10.2, 1/30); Eigen::MatrixXd U(5200, 3); int i = 0; for (double x = 10.2/2.0; x < 200; x += 10) { for (double y = 10.2/2.0; y < 200; y += 10) { for (double t = 0; t <= 360; t
double b = 20.0;
Eigen::Vector3d C(1.0/10.2, 1.0/10.2, 1/30);
Eigen::MatrixXd U(5200, 3);
int i = 0;
for (double x = 10.2/2.0; x < 200; x += 10) {
for (double y = 10.2/2.0; y < 200; y += 10) {
for (double t = 0; t <= 360; t += 30) {
U(i, 0) = x;
U(i, 1) = y;
U(i, 2) = psi;
i += 1;
}
}
}
我感到困惑的是:
p[I+4]
平方矩阵p[i+4]
都是一个零矩阵我无法破译我的错误。请帮忙 试着在里面打印一些东西,看看你能得到什么。它真的是一个一维向量吗?同样,i在U.shape[0]范围内的
行:
应该是i在U.shape[0]范围内的:
s
确实是一个一维向量U[i]
是矩阵的第i
行,所以U[i].T
是一个列数组。当您从1d(~row)数组s
中减去它时,您将通过数组广播得到一个矩阵。旁注:您应该使用np.array
而不是np.matrix
,因为前者更灵活,而且您似乎没有实际使用矩阵方法(数组也不会出现同样的问题,因为这样U[i]
将是1d数组,因此U[i]。t
将与U[i]
相同。
Eigen::VectorXd operator()(const Eigen::VectorXd& s) {
Eigen::VectorXd p(length());
p(0) = s[0];
p(1) = s[1];
p(2) = s[2];
p(3) = s[3];
for (int i = 0; i < U.rows(); i++) {
p(i + 4) = b*exp(-0.5*(s.tail(U.cols()) - U.row(i).transpose()).dot(C*(s.tail(U.cols())
- U.row(i).transpose())));
if (p(i + 4) < 0.1) {
p(i + 4) = 0;
}
}
return p;
}
my_x = 10.2/2.0
my_y = 10.2/2.0
my_p = 0
xx = []
while my_x < 200:
xx.append(my_x)
my_x += 10
yy = []
while my_y < 200:
yy.append(my_y)
my_y += 10
pps = []
while my_psi <= 360:
pps.append(my_p)
my_p+=30
U =[]
for x in xx:
for y in yy:
for p in pps:
U.append([x,y,p])
U = numpy.matrix(U)
C = numpy.array([1.0/10.2, 1.0/10.2, 1.0/30.0])
b = 20.0
def doSomething(s): # Where s is a numpy array (1-d vector)
p[0:4] = s[0:4]
for i in range (U.shape[0]):
s_dash = -0.5*(s - U[i].T)
s_ddash = C*s
s_dddash = s_dash.dot(s_ddash) - U[i].T
p[i+4] = b * numpy.exp(s_dddash)
if p[i+4] < 0.1: p[i+4] = 0