【发布时间】:2014-01-09 07:41:51
【问题描述】:
我正在将 matlab 文件转换为 python 代码。我的 matlab 文件是:
function [q,len] = curve_to_q(p)
[n,N] = size(p);
for i = 1:n
v(i,:) = gradient(p(i,:),1/(N));
end
len = sum(sqrt(sum(v.*v)))/N;
v = v/len;
for i = 1:N
L(i) = sqrt(norm(v(:,i)));
if L(i) > 0.0001
q(:,i) = v(:,i)/L(i);
else
q(:,i) = v(:,i)*0.0001;
end
end
转换后的代码是:
from __future__ import division
import numpy as np
from scipy.io import loadmat,savemat
import os
def curve_to_q(p):
n, N = p.shape # nargout=2
for i in range(1, (n +1)):
v[(i -1), :] = np.gradient(p[(i -1), :], 1 / (N))
len_ = np.sum(np.sqrt(np.sum(v.np.dot(v)))) / N
v = v / len_
for i in range(1, (N +1)):
L[(i -1)] = sqrt(norm(v[:, (i -1)]))
if L[(i -1)] > 0.0001:
q[:, (i -1)] = v[:, (i -1)] / L[(i -1)]
else:
q[:, (i -1)] = v[:, (i -1)] * 0.0001
return q, len_
但是,
好像有问题len_ = np.sum(np.sqrt(np.sum(v.np.dot(v)))) / N
和
L[(i -1)] = sqrt(norm(v[:, (i -1)]))
我怎样才能使它正确转换为 python?
【问题讨论】:
-
什么样的问题?
-
首先,您没有在
curve_to_q的任何地方定义初始化v,这可能会导致问题。L也一样。如果v是一个数组,你应该使用*,而不是np.dot,如果v是一个矩阵,你应该使用np.multiply(因为你想要.*,这是元素乘法,不是矩阵乘法)。 -
@ShinTakezou:我无法理解 np.sum(v.np.dot(v))) 在 python 中的工作方式?
-
我觉得你需要把
v.np.dot改成v.dot