我有一个包含任意数量的独立数据集的数据文件;数据分为三列,包含任意数量的行,并将在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
答案 0 :(得分:2)
首先,您实际上并不想要单独的变量。您需要单元格数组,如var{1}
,var{2}
,var{3}
或变量索引var{i}
。
其次,在我看来,分离数据集的标准是从一行到下一行的时间步长为负时。那是准确的吗?如果是这样,那么diff
会帮助你。要查找边缘值,请使用以下内容:
edges = find(diff(x(:,1)) < 0);
现在,在边缘周围添加一个for
循环,并将适当的范围直接提取到单元格数组中。请注意,此示例中只有两个“边缘”...您的第一个集合从一个开始并运行到第一个边缘。你的第二组从边缘+ 1开始并运行到edge2,你的最终设置从edge2 + 1开始并运行到数组的末尾。
starts = [1; edges];
stops = [edges + 1; length(x)];
我为你留下剩下的代码......
答案 1 :(得分: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