0

別のディレクトリ内のファイルからデータをインポートして特定のモデルに適合させるMATLAB関数を作成したいのですが、データをフィルター処理する必要があるためです(ファイル内のさまざまな場所に「スラッシュ」データがあります。たとえば、以前は何も測定されていません。分析されたモーションが開始されます)。

したがって、近似に使用されるデータを含むベクトルの長さが異なるため、行列で返すことができません(たとえば、以下の関数のx)。どうすればこれを解決できますか?

私はたくさんのデータファイルを持っているので、「手動」の方法を使いたくありません。私の機能は以下の通りです。すべてと提案を歓迎します。

datafit.m

function [p, x, y_c, y_func] = datafit(pattern, xcol, ycol, xfilter, calib, p_calib,    func, p_0, nhl)

    datafiles = dir(pattern);
    path = fileparts(pattern);
    p = NaN(length(datafiles));
    y_func = [];
    for i = 1:length(datafiles)
        exist(strcat(path, '/', datafiles(i).name));
        filename = datafiles(i).name;
        data = importdata(strcat(path, '/', datafiles(i).name), '\t', nhl);
        filedata = data.data/1e3;
        xdata = filedata(:,xcol);
        ydata = filedata(:,ycol);
        filter = filedata(:,xcol) > xfilter(i);
        x(i,:) = xdata(filter);
        y(i,:) = ydata(filter);
        y_c(i,:) = calib(y(i,:), p_calib);
        error = @(par) sum(power(y_c(i,:) - func(x(i,:), par),2));
        p(i,:) = fminsearch(error, p_0);
        y_func = [y_func; func(x(i,:), p(i,:))];
    end
end

サンプルデータ: http: //hastebin.com/mokocixeda.md

4

2 に答える 2

1

私が考えることができる2つの戦略があります:

  • 代わりに、個々のセルが異なる長さのベクトルを格納するセルのベクトルでデータを返します。配列と同じ方法でデータにアクセスできますが、中括弧を使用します。たとえば、c {1} = [1 2 3]、c {2} = [1 2 10 8 5] c {3}=[]と言います。
  • ベクトルの長さが同じになる場合は、行の読み取り時にごみデータをフィルタリングすることもできます。
于 2012-12-01T15:47:13.597 に答える
0

メモリが大きな問題ではない場合は、NaNやInfなどの個別の値でベクトルを埋めてみてください。これらの値は、物理的なコンテキストに基づいた測定では見つかりません。マトリックス(*)にメモリを割り当てる前に、最長のデータセットを特定する必要がある場合があります。このようにして、同じサイズの行列を使用して、後で「空のデータ」を簡単に無視できます。

(*)アイデア...最初に最大のファイルのサイズに基づいてメモリを割り当てます。たとえばNaNで埋めます

matrix = zeros(length(datafiles), longest_file_line_number) .* NaN;

次に、関数を実行します。連続する最長のデータセットの長さを決定します。

new_max = length(xdata(filter));
if new_max > old_max
    old_max = new_max;
end
matrix(i, length(xdata(filter))) = xdata(filter);

関数が行列を返す前に、それに応じて行列を切り取ります...

matrix = matrix(:, 1:old_max);
于 2012-12-04T14:47:46.050 に答える