0

我有一个包含任意数量的独立数据集的数据文件;数据分为三列,包含任意数量的行,并将在 MATLAB 中进行处理。第一列包含时间值,另外两列包含相应的数据。这三个集合是串联的,每个集合不一定包含相同数量的行,时间值也不一定在同一时间开始或结束。例如,考虑以下具有三个数据集的矩阵,由最左列中的时间范围确定:

0.010    xxx    xxx
0.012    xxx    xxx
0.014    xxx    xxx
0.008    xxx    xxx
0.011    xxx    xxx
0.013    xxx    xxx
0.014    xxx    xxx
0.016    xxx    xxx
0.009    xxx    xxx
0.010    xxx    xxx
0.012    xxx    xxx
0.015    xxx    xxx

其中 xxx 是对本练习不重要的数据值,但它们必须与最左侧列中的相应时间值保持关联。在 MATLAB 中将每个数据集与其他数据集分开的最简单/最有效的方法是什么?也就是说,我想最终将每个集合放在一个单独的变量中:

var1
0.010    xxx    xxx
0.012    xxx    xxx
0.014    xxx    xxx

var2
0.008    xxx    xxx
0.011    xxx    xxx
0.013    xxx    xxx
0.014    xxx    xxx
0.016    xxx    xxx

var3
0.009    xxx    xxx
0.010    xxx    xxx
0.012    xxx    xxx
0.015    xxx    xxx
4

2 回答 2

2

首先,您实际上并不想要单独的变量。您需要元胞数组,如var{1}, var{2}, var{3}, 或由变量 索引var{i}

其次,在我看来,分离数据集的标准是当从一行到下一行的时间步长变为负数时。那准确吗?如果是这样,那么diff会帮助你。要查找边缘值,请使用以下内容:

edges = find(diff(x(:,1)) < 0);

现在,for在边缘周围添加一个循环,并将适当的范围直接提取到您的元胞数组中。请注意,此示例中只有两个“边”...您的第一组从一个开始并运行到第一个边。您的第二组从 edge+1 开始并运行到 edge2,而您的最后一组从 edge2+1 开始并运行到数组的末尾。

starts = [1; edges];
stops  = [edges + 1; length(x)];

我把剩下的代码留给你......

于 2012-10-05T19:00:18.263 回答
0

这是我的尝试:

%# read the data
[a,b,c] = textread('data.txt', '%f%s%s');

%# find proper indices to the groups of data
inds = [
    1                   %# include first entry
    find(diff(a)<0)+1   %# add one because diff shrinks the array by 1
    length(a)];         %# include the last entry

%# simply loop over the indices, and assign each range thus defined
%# to an entry in a cell array
A = cell(numel(inds)-1,1);
B = A;
C = A;
for ii = 1:numel(inds)-1
    range = inds(ii) : inds(ii+1)-1;
    A{ii} = a(range);
    B{ii} = b(range);
    C{ii} = c(range);
end
于 2012-10-05T19:11:31.383 回答