2016-11-28 3 views
-1

fscanf에서 약간의 어려움을 발견하고 파이썬 3.5에서 웨이블릿 변환 순서 2를 수행합니다. 또한, 플롯 블록이 올바른지 확인하고 싶습니다. 여기 내 MATLAB 코드입니다 :Matlab 코드를 파이썬 3.5+로 변환

D_P=fopen('distance_profil.txt','r'); 
i=0; 
    while(feof(D_P)==0)% test for end of file 
    i=i+1; 
    sign=fscanf(D_P,'%f , '); 
    classe=fgetl(D_P); 
    %Wavelet Transform 
    [caH(i,:),cdH(i,:)] = dwt(sign,'db2');   
    %Segmentation  
    loc=[]; 
    [pks,locs] = findpeaks(abs(cdH(i,:)),'threshold',3); 
    loc=[loc,locs]; 
    mod=abs(cdH(i,:)); 
    figure 
    titre = ['distance profil : ' classe]; 

    subplot(2,1,1); plot(sign); title(titre); 
    hold on, plot(2*locs,sign(2*locs),'dr') 
    subplot(2,1,2); plot(abs(cdH(i,:))); title('Module des Details coef. for db2'); 
    hold on, plot(locs,mod(locs),'dr')  
end 

그리고 아래의 두 가지 문제는 파이썬 코드를 많이에서 MATLAB 코드로 같은 일을하고 있지 않은지 있습니다

import pywt 
import numpy as np 
from scipy.signal import find_peaks_cwt 
from scipy import * 
import matplotlib.pyplot as plt 

D_P= open ("distance_profil.txt","r") 
i=0 

while True: 
    line = D_P.readline().strip() 
    if line == '': 

     def ReadFile(): 
      sign = [] 
      with open('textfiledata.txt', 'rt') as myFile: 
       for line in myFile: 
        sign.append(map(int, line.split(','))) 
      return sign 

     classe = D_P.readline().rstrip() 
     cA= np.array(sign) 
     cD= np.array(sign) 

     i+=1 

     array[cA[i,], cD[i,]] = pywt.dwt([sign, 'db2']) 

     loc = [] 
     [pks,locs] = find_peaks_cwt(abs(cdH([i,]),'threshold',3) 

     loc = [loc,locs] 
     mod=abs(cdH[i,]) 

     plt.figure() 
     plt.subplot(2,2,1) 
     plt.plot(sign,2*locs,sign(2*locs),'ro') 
     plt.title('distance profil : ' , classe) 

     plt.subplot(2,2,2) 
     plt.plot(abs(cdH(i,)),locs,mod(locs),'ro') 
     plt.title("Module des Details coef. for db2") 

     plt.show() 

    break 
+0

그럼 시도는 어떻습니까? –

+1

코드가 맞는지 어떻게 알 수 있습니까? [ask]를 읽으십시오. –

+0

이 명령어 배열에 오류가 있습니다. [cA [i,], cD [i,]] = pywt.dwt ([sign, 'db2']) – user7220128

답변

3

파이썬 코드 내 시도 여러 장소에서 파이썬 코드가 유효하지 않습니다.

먼저 MATLAB 코드에서이 줄은 파일 끝에 도달 할 때까지 루프를 계속합니다 : while(feof(D_P)==0)%. 파이썬에서이 줄을 사용하여 똑같은 일을하려고하는 것 같습니다 : if line == '':. 그러나 행이 비어있는 경우에만 코드가 실행됩니다.

이 방법을 파이썬에서 사용할 수 있지만 그렇게해서는 안됩니다. for line in D_P:을 사용하여 배열 인 것처럼 루프를 반복 할 수 있습니다. 그러면 자동으로 D_P 행을 반복하며 각 행은 변수 line에 있습니다. 또한 ReadFile 함수에서와 마찬가지로 파일을 안전하게 열고 닫으려면 with open ("distance_profil.txt","r") as D_P:을 사용해야합니다. 그리고 for i, line in enumerate(D_P):으로 색인을 추적하기 위해 enumerate을 사용할 수 있습니다. 또한 각 행을 두 번 읽으려고 시도하는데, 이는 실제로 다른 행을 읽는 것을 의미합니다.

다음 문제는 cA= np.array(sign)입니다. 어디에도 sign 변수를 정의하지 마십시오. 이것은 사용하지 않고 삭제해야하는 ReadFile() 함수에 정의되어 있습니다. 따라서 sign 변수를 사용하는 대신 scipy.sign 함수를 사용합니다.이 변수는 sign 변수를 정의한 경우 재정의해야합니다. 그래서 from ___ import *은 나쁜 생각입니다. import scipy as sp 또는 그와 비슷한 것을 사용하십시오. 그러나 별도로 가져 오는 하나의 scipy 함수 만 사용하므로이 작업이 필요하지 않습니다.

MATLAB과 달리 함수는 Python의 1 급 객체입니다. 다른 변수와 마찬가지로 사용할 수 있습니다. 따라서 여러분이 의도 한 숫자 데이터가 아닌 하나의 함수를 포함하는 배열을 생성하고 있습니다. 그러나 숫자 입력이 필요한 dwt 함수에 대해서는 실패합니다. 당신이해야 할 일은 텍스트 줄을 숫자 배열로 변환하는 것입니다. ReadLine에서 사용 된 접근법은 잘못된 파일을 읽고 한 줄 대신 전체 파일을 읽는 것 외에는 어딘가에서 복사 했습니까? 그러나 이것은 아주 좋은 접근 방법은 아닙니다. np.fromstring(line.strip(), sep=' ')을 사용하는 것이 더 좋습니다. 이것은 문자열을 공백으로 구분 된 일련의 숫자로 해석하고 (필요한 것으로 바꾸십시오) numpy 배열로 변환합니다. 이것은 더 빠르고 쉽습니다.

다음으로 dwt 함수를 사용하면 array[cA[i,], cD[i,]]에 할당됩니다. 이것은 array 변수가 없기 때문에 원하는 것을 수행하지 않고 작동하지 않습니다. array이 2D numpy 배열이면 icAcD의 값에 해당하는 좌표의 인덱스에 dwt의 결과를 할당합니다. cAcD에만 할당하려고합니다. 즉, cAcD의 이전 정의를 제거 할 수도 있습니다.

그런 다음 dwt 호출을 사용하면 []에 입력을 래핑합니다. 파이썬에서는 목록을 원하는 두 인수가 아닌 단일 인수로 전달합니다.MATLAB에서는 숫자 배열을 문자 배열 (실패 할 것입니다)에 연결하려고 시도하고 함수에 대한 단일 입력으로 전달하기 때문에 MATLAB에서도 작동하지 않습니다. 따라서 pywt.dwt(sign, 'db2')을 수행하십시오.

그러면 해당 줄은 cA, cD = pywt.dwt(sign, 'db2')이됩니다.

또한 cdH을 여러 개 사용하지만 정의하지 마십시오. cD이되어야하나요? 또한 cdH([i,])을 사용하면 MATLAB은 함수 호출과 배열 액세스를 구분하지 않지만 파이썬에서는 구분됩니다. 대괄호 []과 대괄호 만 사용하여 색인을 생성해야합니다. cdH([i,])은 "cdH 함수를 호출합니다. 목록 입력이 [i,]이고 cdH은 함수가 아니기 때문에 (또는 정의 된 경우가 아니기 때문에) 작동하지 않습니다. 후미의 쉼표도 중복됩니다. cdh[i]을한다.

다음, 당신은 다음, 다음 locs을 정의, 빈 목록으로 loc을 정의 loc = [loc, locs]을한다. MATLAB에서,이 (중복하지만 유효한). 파이썬 그러나, 이것은을 생성 locsloc에 추가 목록은 [[], locs]과 완전히 다르므로이 세 줄을 으로 줄여야합니다.

또한 아래에 sign(2*locs)이라고 씁니다. 앞에서 말했듯이 색인 생성에는 대괄호를 사용해야하므로 sign[2*locs]이어야합니다.

다음으로 파이썬에는 mod 기능이 없습니다. %을 사용하여 파이썬에서 모듈러스를 수행하십시오. 하나의 인수를 가진 mod이 내 MATLAB 버전에서 무엇을하는지 확신 할 수 없다. 그러나 문맥에 따라 부분 부분을 얻으려는 것으로 가정합니다. 부분 부분은 locs%1입니다.

마지막으로 plt.plot(abs(cdH(i,)),locs,mod(locs),'ro')을 수행합니다. MATLAB이나 Python은 이와 같이 세 개의 배열로 그릴 방법을 알지 못합니다. plt.plot(abs(cdH(i,)))을 MATLAB 코드처럼 plot 명령으로 나눠야하거나, plot의 첫 번째 인수로 np.arange(len(cdH(i,)))을 넣어야합니다. 다른 줄거리와 동일합니다.

전반적으로 MATLAB 또는 Python (또는 둘 다)에 익숙하지 않은 것처럼 보입니다. 이러한 코드를 다시 작성하기 전에 두 가지의 기본 사항을 다듬는 것이 좋습니다.

+4

[좋은 질문을하는 법을 가르쳐] 또한 신중해야한다. (http://stackoverflow.com/questions/40844641/converting-matlab-code-to-python-3-5 # comment68907906_40844641). –