我有一个矩阵M1,其中每一行都是一个时变信号。
我还有另一个矩阵M2,与M1具有相同的维度,其中每一行也是一个时变信号,作为“模板”,用于识别第一个矩阵中的信号形状。
我的目标是得到一个列向量v,其中v [i]是M1的第i行和M2的第i行之间的相关性。
我查看了numpy的corrcoef函数,并尝试了以下代码:
我一直在阅读文档,但仍然不清楚我需要选择哪些矩阵条目作为我的向量v的条目。
有人可以帮忙吗?
(我已经学习了几个类似问题的S.O.答案,但还没有看到光...)
代码背景:
有256行(信号),我在“主信号”上运行一个窗口大小为200的滑动窗口,其长度为10k个样本。因此,M1和M2都是256行x200列。对不起,关于10k个样本的错误。那是总信号长度。通过使用滑动模板的相关性,我尝试找到最佳匹配模板的偏移量。实际上,我正在寻找256通道侵入性心电图(或者如医生所称的心电图)中的QRS波群。
我还有另一个矩阵M2,与M1具有相同的维度,其中每一行也是一个时变信号,作为“模板”,用于识别第一个矩阵中的信号形状。
我的目标是得到一个列向量v,其中v [i]是M1的第i行和M2的第i行之间的相关性。
我查看了numpy的corrcoef函数,并尝试了以下代码:
import numpy as np
M1 = np.array ([
[1, 2, 3, 4],
[2, 3, 1, 4]
])
M2 = np.array ([
[10, 20, 30, 40],
[20, 30, 10, 40]
])
print (np.corrcoef (M1, M2))
这会输出:
[[ 1. 0.4 1. 0.4]
[ 0.4 1. 0.4 1. ]
[ 1. 0.4 1. 0.4]
[ 0.4 1. 0.4 1. ]]
我一直在阅读文档,但仍然不清楚我需要选择哪些矩阵条目作为我的向量v的条目。
有人可以帮忙吗?
(我已经学习了几个类似问题的S.O.答案,但还没有看到光...)
代码背景:
有256行(信号),我在“主信号”上运行一个窗口大小为200的滑动窗口,其长度为10k个样本。因此,M1和M2都是256行x200列。对不起,关于10k个样本的错误。那是总信号长度。通过使用滑动模板的相关性,我尝试找到最佳匹配模板的偏移量。实际上,我正在寻找256通道侵入性心电图(或者如医生所称的心电图)中的QRS波群。
lg.info ('Processor: {}, time: {}, markers: {}'.format (self.key, dt.datetime.now ().time (), len (self.data.markers)))
# Compute average signal shape over preexisting markers and uses that as a template to find the others.
# All generated markers will have the width of the widest preexisting one.
template = np.zeros ((self.data.samples.shape [0], self.bufferWidthSteps))
# Add intervals that were marked in advance
nrOfTerms = 0
maxWidthSteps = 0
newMarkers = []
for marker in self.data.markers:
if marker.key == self.markerKey:
# Find start and stop sample index
startIndex = marker.tSteps - marker.stampWidthSteps // 2
stopIndex = marker.tSteps + marker.stampWidthSteps // 2
# Extract relevant slice from samples and add it to template
template += np.hstack ((self.data.samples [ : , startIndex : stopIndex], np.zeros ((self.data.samples.shape [0], self.bufferWidthSteps - marker.stampWidthSteps))))
# Adapt nr of added terms to facilitate averaging
nrOfTerms += 1
# Remember maximum width of previously marked QRS complexes
maxWidthSteps = max (maxWidthSteps, marker.stampWidthSteps)
else:
# Preexisting markers with non-matching keys are just copied to the new marker list
# Preexisting markers with a matching key are omitted from the new marker list
newMarkers.append (marker)
# Compute average of intervals that were marked in advance
template = template [ : , 0 : maxWidthSteps] / nrOfTerms
halfWidthSteps = maxWidthSteps // 2
# Append markers of intervals that yield an above threshold correlation with the averaged marked intervals
firstIndex = 0
stopIndex = self.data.samples.shape [1] - maxWidthSteps
while firstIndex < stopIndex:
corr = np.corrcoef (
template,
self.data.samples [ : , firstIndex : firstIndex + maxWidthSteps]
)
diag = np.diagonal (
corr,
template.shape [0]
)
meanCorr = np.mean (diag)
if meanCorr > self.correlationThreshold:
newMarkers.append ([self.markerFactories [self.markerKey] .make (firstIndex + halfWidthSteps, maxWidthSteps)])
# Prevent overlapping markers
firstIndex += maxWidthSteps
else:
firstIndex += 5
self.data.markers = newMarkers
lg.info ('Processor: {}, time: {}, markers: {}'.format (self.key, dt.datetime.now ().time (), len (self.data.markers)))
M1
和M2
的形状是什么? - Divakarcorr2_coeff_rowwise2
? - Divakar