2014-01-09 2 views
1

matlab 파일을 파이썬 코드로 변환하고 있습니다. 내 MATLAB 파일은 다음과 같습니다matlab에서 python으로 코드 변환

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)])) 

에 문제가있는 것 같다

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 

변환 코드는 파이썬으로의 적절한 변환?

+1

어떤 종류의 문제입니까? – ShinTakezou

+0

먼저,'v'를'curve_to_q'의 어느 곳에서나 초기화하도록 정의하지 않습니다. 이것은 문제를 일으킬 수 있습니다. 'L'과 동일합니다. 'v'가 배열 인 경우,'np.dot'가 아니라'*'를 사용해야하고'v'가 행렬 인 경우'np.multiply'를 사용해야합니다 ('. *'를 원하기 때문에, 이는 행렬 곱셈이 아니라 요소 승법). – senshin

+0

@ShinTakezou : np.sum (v.np.dot (v))가 파이썬에서 어떻게 작동하는지 이해할 수 없습니까? – sam

답변

1

numpy로 작업하면 모든 배열을 파이썬 배열 (목록 목록)이 아닌 numpy 배열로 초기화 한 다음 실행시 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

첫 번째 문제는 매트랩, 기본적으로 지난 차원 이상 sum 금액, NumPy와에있는 동안, 기본적으로 평탄화 된 배열을 통해 np.sum 금액.

matlab에

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

파이썬 :

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

두 번째 문제는 당신이 np.sqrtnp.norm하지 sqrt을 필요로한다는 것입니다 :

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

당신은 파이썬이 뭔가를 필요 및 norm.