相对较新的matlab,想要为我的项目选择最佳选项。
我在办公室周围的设置位置有几个温度探头,我必须在平面图上显示热图。 (This有点像我想要实现的,其中点是探测器,这将覆盖在平面图上)
目前我正在寻找组织和绘制数据的最佳方式。
我有一个来自每个探针的csv文件,其中包含timestamp
列和温度列。
每个csv文件可能大约有大约3个月/ 2000个读数。
目前,我将来自不同探针的所有csv文件导入到单元格,并按照与其位置对应的数字进行组织。
因此data{1}{1}
包含时间戳,data{1}{2}
包含位置1的探针温度。data{2}
用于位置2,依此类推。这是存储它的好方法吗?
最终,我需要能够在查看地图的同时寻找或玩游戏。但目前我只是在寻找最佳选择来制作图表。
我有平面图图像,我知道我必须找到位置的像素/ xy表示,但那么呢?
绘制所有这些探针的最佳方法是什么。 我打算使用冲浪(俯视图),但这需要一个x / y坐标数组?
我的想法是将位置存储为静态整数,loc1X = ..,loc1y =等,然后创建类似[loc1X loc1Y data{1}{2}(1); loc2X loc2Y data{2}{2}(1)]
的数组,但冲浪仍然说Z需要是一个要绘制的数组。
答案 0 :(得分:1)
假设您的位置在矩形网格中没有设置为相距1米(这可能是一个奇怪的办公室...),您将面临通过分散的数据点插入表面的问题。 Matlab函数TriScatteredInterp
将是您所需要的。只需按照链接中的示例进行一些更改:
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}
并在图中添加一个滑块来选择不同的时间。
请注意,这假设所有节点都以相同的时间戳收集数据 。如果不是这种情况(我怀疑它不是这种情况),则必须再做一步:在每个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
答案 1 :(得分:0)
以下是您的第二个问题的答案(在上面的评论中):
% 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上提出一个新问题;在一个帖子中提出所有问题通常不被认为是好习惯,因为这将使得很难找到任何未来的googlers遇到同样的问题。