试图在Python中计算SVD以找到频谱中最重要的元素,并创建一个矩阵,其中只包含最重要的部分。
在python中,我有:
u,s,v = linalg.svd(Pxx, full_matrices=True)
这给出了3个矩阵;其中“s”包含对应于u,v的震级
为了构建一个包含信号所有有效部分的新矩阵,我需要捕获“s”中的最高值,并将它们与“u”和“v”中的列相匹配,生成的矩阵应给出数据的最重要部分。
问题是我不知道如何在Python中实现这一点,例如,如何在“s”中找到最高的数字,并在“u”和“v”中选择列以创建新的矩阵?
(我对Python和numpy还不熟悉)所以如果有任何帮助将不胜感激
编辑:
import wave, struct, numpy as np, matplotlib.mlab as mlab, pylab as pl
from scipy import linalg, mat, dot;
def wavToArr(wavefile):
w = wave.open(wavefile,"rb")
p = w.getparams()
s = w.readframes(p[3])
w.close()
sd = np.fromstring(s, np.int16)
return sd,p
def wavToSpec(wavefile,log=False,norm=False):
wavArr,wavParams = wavToArr(wavefile)
print wavParams
return mlab.specgram(wavArr, NFFT=256,Fs=wavParams[2],detrend=mlab.detrend_mean,window=mlab.window_hanning,noverlap=128,sides='onesided',scale_by_freq=True)
wavArr,wavParams = wavToArr("wavBat1.wav")
Pxx, freqs, bins = wavToSpec("wavBat1.wav")
Pxx += 0.0001
U, s, Vh = linalg.svd(Pxx, full_matrices=True)
assert np.allclose(Pxx, np.dot(U, np.dot(np.diag(s), Vh)))
s[2:] = 0
new_a = np.dot(U, np.dot(np.diag(s), Vh))
print(new_a)
linalg.svd
按降序返回s
。所以要选择n
中最高的数字,只需如果将
s
的较小值设置为零然后矩阵乘法将负责“选择”U和V的适当列
例如
给定data here
产生
相关问题 更多 >
编程相关推荐