0

任意の数の独立したデータ セットを含むデータ ファイルがあります。データは 3 列で、任意の数の行を含み、MATLAB で処理されます。最初の列には時間値が含まれ、他の 2 つの列には対応するデータが含まれます。3 つのセットが連結され、それぞれが同じ数の行を含むとは限らず、時間値が同時に開始または終了するわけでもありません。例として、左端の列の時間範囲によって決定される、3 つのデータ セットを含む次のマトリックスを考えます。

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}、または変数でインデックス付けされた のような cell 配列が必要ですvar{i}

第二に、データセットを分離する基準は、ある行から次の行への時間のステップが負になるときであるように見えます。それは正確ですか?もしそうなら、diffあなたを助けるでしょう。エッジ値を見つけるには、次のようなものを使用します。

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

ここで、エッジの周りにループを追加しfor、適切な範囲を cell 配列に直接抽出します。この例では「エッジ」が 2 つしかないことに注意してください...最初のセットは 1 つから始まり、最初のエッジまで続きます。2 番目のセットは 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 に答える