【发布时间】:2014-02-26 04:10:48
【问题描述】:
尝试在 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)
【问题讨论】:
-
将
full_matrices=True更改为full_matrices=False。 -
@unutbu - 我已经改变了它。这个细分。如果我更改
full_matrices=True,则会收到以下错误:ValueError: objects are not aligned.. 有什么想法,抱歉? -
当你说“段”时,你的意思是有段错误,没有错误信息吗?还是会留下诸如
wave.Error: unknown format: -2之类的堆栈跟踪和错误消息? -
@unutbu 只是得到如下错误:
Segmentation fault (core dumped)Pxx 的形状:(129, 146) -
我已经在多个 .wav 上运行了您的代码(使用
full_matrices=False),但无法产生分段错误。可以发PXX吗?令人高兴的是,它不是很大。
标签: python matrix matplotlib svd