0

我在 MATLAB 中有一个矩阵50572x4 doubles。最后一列具有datenum格式日期,从7.3025e+05到增加值7.3139e+05。问题是:

如何将此矩阵拆分为子矩阵,每个子矩阵的间隔时间为 30 天?

如果我不够清楚......第 4 列中的第一个元素和第 4 列中的最后一个元素之间的区别是7.3139e5 − 7.3025e5 = 1.1376e3, 或1137.6. 我想将其划分为 30 天段,并获得一组矩阵,其第 4 列的范围为 30。我不太确定该怎么做……我对 MATLAB 很陌生,但是我正在使用的数据集只有这种表示形式,因此需要采取这样的行动。

4

2 回答 2

0

好吧,您只需要找到边缘时间和它们之间的矩阵索引。因此,如果您的数字是 datenum 格式,则一个单位与一天相同,这意味着我们可以从 30 和 30 个单位跳到最后,如下所示:

startTime = originalMatrix(1,4);
endTime = originalMatrix(end,4);

edgeTimes = startTime:30:endTime;

% And then loop though the edges checking for samples that complete a cycle:

nEdges = numel(edgeTimes);
totalMeasures = size(originalMatrix,1);

subMatrixes = cell(1,nEdges);

prevEdgeIdx = 0;

for curEdgeIdx = 1:nEdges
  nearIdx=getNearestIdx(originalMatrix(:,4),edgeTimes(curEdgeIdx));
  if originalMatrix(nearIdx,4)>edgeTimes(curEdgeIdx)
    nearIdx = nearIdx-1;
  end
  if nearIdx>0 && nearIdx<=totalMeasures
    subMatrix{curEdgeIdx} = originalMatrix(prevEdgeIdx+1:curEdgeIdx,:);
    prevEdgeIdx=curEdgeIdx;
  else
    error('For some reason the edge was not inbound.');
  end
end

% Now we check for the remaining days after the edges which does not complete a 30 day cycle:

if curEdgeIdx<totalMeasures
  subMatrix{end+1} = originalMatrix(curEdgeIdx+1:end,:);
end

此处getNearestIdx讨论了该函数,它为您提供距输入值最近的点,而无需检查所有可能的点。

function vIdx = getNearestIdx(values,point)


if isempty(values) || ~numel(values)
  vIdx = [];
  return
end


vIdx = 1+round((point-values(1))*(numel(values)-1)...
  /(values(end)-values(1)));
  if vIdx < 1, vIdx = []; end
  if vIdx > numel(values), vIdx = []; end
end

注意:这是伪代码,可能包含错误。请尝试将其调整为您的问题。

于 2013-09-08T00:37:57.823 回答
0

请注意,时间戳之间的单位间隔datenum代表 1 天,因此您的数据实际上涵盖了 1137.6 天的时间段)。直接的方法是将每个时间戳与边缘进行比较,以确定它属于哪个 30 天间隔:

t = A(:, end) - min(A:, end);            %// Normalize timestamps to start from 0
idx = sum(bsxfun(@lt, t, 30:30:max(t))); %// Starting indices of intervals
rows = diff([0, idx, numel(t)]);         %// Number of rows in each interval

您的数据矩阵在哪里A,假设最后一列包含时间戳。rows存储相应的 30 天间隔的行数。最后,您可以使用元胞数组来拆分原始数据矩阵:

C = mat2cell(A, rows, size(A, 2));       %// Split matrix into intervals
C = C(~cellfun('isempty', C));           %// Remove empty matrices

希望能帮助到你!

于 2013-09-08T01:10:18.477 回答