2

matlab に比較的慣れていないため、プロジェクトに最適なオプションについて意見を求めています。

オフィス内の設定された場所にいくつかの温度プローブがあり、フロア プラン イメージにヒート マップを表示する必要があります。(これは私が達成したいことのようなもので、ポイントはプローブであり、これはフロアプランに重ねられます)

現時点では、データを整理してグラフ化する最良の方法を探しています。

timestamp列と温度列を含む各プローブからの csv ファイルがあります。各 csv ファイルには、約 3 か月/2000 の読み取り値が含まれる場合があります。

現時点では、さまざまなプローブからのすべての csv ファイルがセルにインポートされ、それらの場所に対応する番号で整理されています。したがってdata{1}{1}、タイムスタンプがdata{1}{2}含まれ、場所 1 のプローブの温度が含まれます。data{2}は場所 2 などです。保存方法はこれでいいの?

最終的には、マップを見ながらさまざまな時間をシークしたりプレイしたりできるようにする必要があります。しかし、現時点では、それをグラフ化するための最良のオプションを探しています。

フロアプランの画像があり、場所のピクセル/XY 表現を見つける必要があることはわかっていますが、その後はどうすればよいでしょうか?

これらすべてのプローブをプロットする最良の方法は何でしょうか。surf(top view) を使用する予定でしたが、これには x/y 座標の配列が必要ですか?

私の考えは、場所を静的な整数、loc1X = ..、loc1y =などとして保存し、次のような配列を作成することでした[loc1X loc1Y data{1}{2}(1); loc2X loc2Y data{2}{2}(1)]が、サーフィンはまだZがプロットする配列である必要があると言います。

4

2 に答える 2

1

あなたの場所が長方形のグリッドで正確に 1m 離れて設定されていないと仮定すると (それは奇妙なオフィスになるでしょう...)、散在するデータポイントを介してサーフェスを補間しなければならないという問題に直面しています。TriScatteredInterpそこで必要になるのが Matlab 関数です。リンクの例に従ってください。いくつかの変更があります。

x = [x values of your locations]
y = [y values of your locations]
z = [all heat readings for all x,y for a single timestamp]

F = TriScatteredInterp(x,y,z);

例のようにプロットします。すべてのタイムスタンプに対してこれを行う必要があるため、擬似コードでは次のようになります。

x = [x values of your locations]
y = [y values of your locations] % assuming they don't change

F = cell(numel(data{1}{1}),1);
for t = 1:numel(data{1}{1}) % loop through all time stamps

    z = cellfun(@(p)p{1}(t), data);
    F{t} = TriScatteredInterp(x,y,z);

end

次に、最初のものをプロットF{1}し、Figure にスライダーを追加して別の時間を選択できます。

これは、すべてのノードが同じタイムスタンプでデータを収集することを前提としていることに注意してください。これが当てはまらない場合 (そうではないと思われます)、もう 1 つの手順を実行する必要があります。各 XY ポイントの時間の次元で補間を作成します。

を使えば簡単にできますspline。例えば、

pp = spline(data{1}{1}, data{1}{2});

spline最初の場所のすべてのデータを作成するため、

z = ppval(pp, [any random time within the interval]) 

間隔内の任意の時点での熱の補間値を提供します。発行することで、これを一度に行うことができます

z = spline(data{1}{1}, data{1}{2}, [any random vector of times] );

要約すると、次のようになります。

% interpolate over time

% NOTE: use the maximum first time, and the minimum last time, 
% to ensure these endpoints are included in all splines.
minTime = max( cellfun(@(p)p{1}(1), data) ); 
maxTime = min( cellfun(@(p)p{1}(1), data) );

trange = minTime : [some step] : maxTime;

npts = size(data,1);
z    = cell(npts,1);
for ii = 1:npts
    % creates interpolation for H(t) at equal times 
    % trange for location ii
    z{ii} = spline(data{ii}{1}, data{ii}{2}, trange);
end

% interpolate spatially

x = [x values of your locations]
y = [y values of your locations] % assuming they don't change

nts = numel(trange)
F = cell(nts,1);
for t = 1:nts    

    zed = cellfun(@(p)p(t),z);
    F{t} = TriScatteredInterp(x,y, zed);

end

% ... and further plotting commands
于 2012-10-19T06:35:45.023 に答える
0

2 番目の質問 (上記のコメント) に対する回答は次のとおりです。

% get a list of all initial sampling times for all sensors
first_times = cellfun(@(x)   x{1}(1), data);
last_times  = cellfun(@(x) x{1}(end), data);

% find the max/min of these times. 
% NOTE: the order of max/min might be counter-intuitive!
[m, im] = max(first_times);
[M, iM] = min(last_times);

% 'im' contains the number of the data set which has the latest initial
% sampling time. 'iM' contains the number of the data set which has the 
% earliest final sampling time.

% Now find the indices to the actual sampling times in all data sets
% that correspond to these initial and final times:

proper_first = cellfun(@(x) find(x{1}==m,1), data);
proper_last  = cellfun(@(x) find(x{1}==m,1), data);

% index times and data in dataset k like so: 
data{k}{1}( proper_first(k) : proper_last(k) ) % times
data{k}{2}( proper_first(k) : proper_last(k) ) % data

今後の参考のために、SO について新しい質問をすることをお勧めします。1 つのスレッドですべての質問をすることは、一般的に良い習慣とは見なされていません。これは、同じ問題に遭遇する将来の Google 社員を見つけるのが難しくなるためです。

于 2012-11-29T10:38:12.267 に答える