2016-11-28 111 views
-1

我发现fscanf有一些困难,并且在python 3.5上做了小波变换2。同样,我想验证剧情块是否正确。 这里是我的Matlab代码:将Matlab代码转换为python 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 

而下面是我尝试用Python代码

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

我们应该如何知道您的代码是否正确?请阅读[问]。 –

+0

我对这个指令数组有错误[cA [i,],cD [i,]] = pywt.dwt([sign,'db2']) – user7220128

回答

3

这两个问题是你的Python代码没有做同样的事情,你的MATLAB代码在很多的地方,你的Python代码在多个地方无效。

首先,在MATLAB代码中,此行继续循环,直至到达文件结尾:while(feof(D_P)==0)%。你显然正试图用python中的这一行做同样的事情:if line == '':。但是,只有在行空白的情况下才会运行代码。

你可以在python中使用这种方法,但你不应该这样做。您可以像使用for line in D_P:那样循环播放数组。这将自动遍历D_P的行,将每行放入变量line。此外,您应该使用with open ("distance_profil.txt","r") as D_P:来安全地打开和关闭文件,如ReadFile函数中所做的那样。您可以使用enumerate跟踪for i, line in enumerate(D_P):的索引。你也尝试两次读取每一行,这意味着你最终会阅读每一行。

接下来的问题是这条线cA= np.array(sign)。您不要在任何地方定义sign变量。它在ReadFile()函数中定义,您永远不会使用它并应该删除它。因此,而不是使用sign变量,而是使用scipy.sign函数,如果您已定义sign变量,则该函数将被覆盖。这就是为什么from ___ import *是个坏主意。使用import scipy as sp或类似的东西。但是,由于您只使用单独导入的一个scipy函数,因此您不需要该函数。

与MATLAB不同,函数是Python中的第一类对象。你可以像使用其他变量一样使用它们。所以你正在创建一个包含一个函数的数组,而不是你显然想要的数字数据。然而,这对于需要数字输入的dwt函数来说是失败的。你需要做的是将文本行转换为数字数组。在ReadLine中使用的方法是可以的,除了它正在读取错误的文件并读取整个文件而不是一行,您是否从某处复制该文件?但是,这不是一个很好的方法。最好使用np.fromstring(line.strip(), sep=' ')。这将把一个字符串解释为由空格分隔的一系列数字(用你需要的任何东西代替)并将它转换为一个numpy数组。这是更快,更容易。

接下来,使用dwt函数,将您分配给array[cA[i,], cD[i,]]。这不是做你想做的事情,也不会工作,因为没有array变量。如果array是二维numpy阵列,则这会将dwt的结果分配给对应于cAcD的索引i处的值的坐标处的索引。你只是想分配到cAcD。这意味着您也可以删除早期定义的cAcD

然后,用dwt调用,将输入包装在[]中。在Python中,这将列表作为单个参数传递,而不是您想要的两个参数。在MATLAB中它也不会工作,因为它会尝试连接一个带有字符数组的数组(这将会失败),并且将它作为函数的单个输入传递。那么做pywt.dwt(sign, 'db2')

因此该行应该是:cA, cD = pywt.dwt(sign, 'db2')

此外,您使用cdH几个地方,但从来没有定义它。它应该是cD? MATLAB也没有区分函数调用和数组访问,但是python的确如此。您需要使用方括号[]和方括号才能建立索引。 cdH([i,])将被解释为“调用函数cdH与列表输入[i,],这将不起作用,因为cdH是不是一个函数(或不会如果它被定义)。尾随逗号也是多余的。做cdh[i]

接下来,定义loc为空列表,然后定义locs,然后做loc = [loc, locs]。在MATLAB中,这个附加locsloc(这是多余的,但有效的)。但在Python中,这将创建一个看起来像[[], locs],这是完全不同的,你应该把这三行减少到[pks,loc] = find_peaks_cwt(abs(cdH([i,]),'threshold',3)

另外,下面还有你写的sign(2*locs)。正如我所说,你需要使用括号进行索引,所以这需要是sign[2*locs]

接下来,python没有mod函数。使用%在Python中做模数。我不知道在你的MATLAB版本中有什么mod带有单一的参数,在我的版本中它会引发错误。然而,我从上下文中假设,您正在尝试获取小数部分,这将是locs%1

最后,你做plt.plot(abs(cdH(i,)),locs,mod(locs),'ro')。 MATLAB和Python都不知道如何绘制这样的三个数组。您可能需要将plt.plot(abs(cdH(i,)))划分为它自己的plot命令,如MATLAB代码所做的那样,或者将np.arange(len(cdH(i,)))作为plot的第一个参数。与其他情节一样。总体而言,似乎你对MATLAB或Python(或两者)都不太熟悉。在尝试再次编写这些代码之前,应该仔细阅读两者的基础知识。

+4

[教OP如何提出一个好问题]也是谨慎的(http://stackoverflow.com/questions/40844641 /转换与Matlab代码到蟒-3-5#comment68907906_40844641)。 –