2014-01-09 124 views
1

我正在将matlab文件转换为python代码。我的MATLAB文件是:从matlab到python的代码转换

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?

+1

有什么样的问题? – ShinTakezou

+0

首先,您不要在'curve_to_q'中的任何位置定义初始化'v',这可能会导致问题。 'L'一样。如果'v'是一个数组,你应该使用'*',而不是'np.dot',如果'v'是一个矩阵,你应该使用'np.multiply'(因为你需要'。*',这是元素乘法,而不是矩阵乘法)。 – senshin

+0

@ShinTakezou:我无法理解,np.sum(v.np.dot(v)))如何在python中工作? – sam

回答

1

使用numpy时,最好将所有数组初始化为numpy数组而不是python数组(列表列表),然后在执行时转换为numpy。因此,第一步我会放入v = np.zeros(n, N)进行初始化。这应该解决你的第二个问题。

下一步是让您的代码更具可读性。删除N + 1/i-1等L不需要是一个列表 - 只有当前值被使用,因此将其更改为本地变量而不是列表。

在matlab中:v.*v不是点积,它是两个数组的元素乘以元素。此外,当您尝试使用v自己的点积时,v不是正方形,所以它不起作用。但是,我们可以使用带转置的点积来简化这一步。

下面的代码应该有所帮助。 matlab代码中的第一个sum总计'第一个数组维度'(我忘记了这是哪一个) - 因此您必须检查v_squared_sum在两种语言中的维数是否相同。

def curve_to_q(p): 
    n, N = p.shape # nargout=2 
    v = np.zeros((n, N)) 
    for i in range(n): 
     v[i, :] = np.gradient(p[i, :], 1/N) 
    v_squared_sum = v.dot(v.transpose()) # 1 x (n or N) array 
    len_ = np.sum(np.sqrt(v_squared_sum))/N 
    v = v/len_ 
    for i in range(N): 
     L = sqrt(norm(v[:, i])) 
      q[:, i] = v[:, i]/max(L, 0.0001) 
    return q, len_ 
0

你的第一个问题是,在Matlab,sum金额超过默认情况下,最后一个维度,而在numpy的,np.sum资金默认扁平阵列上。

Matlab的

>> sum([5,5,5;5,5,5]) 
ans = 
    10 10 10 

的Python:

>>> np.sum([[5,5,5],[5,5,5]]) 
30 

您需要像这样在Python:

>>> np.sum([[5,5,5],[5,5,5]], axis=0) 
array([10, 10, 10]) 

的第二个问题是,你需要np.sqrtnp.norm,不sqrtnorm