Matlab организует и отображает данные о температуре
Автор вопроса: CrocОтветов: 2
Относительно новичок в Matlab, хотел бы получить некоторые советы о лучших вариантах для моего проекта.
У меня есть несколько датчиков температуры в определенных местах по всему офису, и мне нужно отобразить тепловую карту на изображении плана этажа. (Это примерно то, чего я хочу добиться, где точки - это зонды, а это будет наложен на план этажа)
На данный момент я ищу лучший способ организовать и отобразить данные.
У меня есть 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)], но Surf по-прежнему говорит, что Z должен быть массивом для построения.
Лично я бы не стал хранить отдельный набор меток времени для каждого зонда. Учитывая, что ваш набор данных кажется относительно небольшим, у меня возникло бы искушение просто иметь один большой массив: временная метка первого столбца, температура второго столбца на зонде 1, температура третьего столбца на зонде 2 и т. д. FakeDIY 19.10.2012
@FakeDIY: предполагается, что все временные метки для всех зондов равны. Если это не так, то мне кажется, что массив ячеек, который есть у OP, в порядке. Rody Oldenhuis 19.10.2012
Предполагая, что ваши местоположения не настроены так, чтобы быть ровно в 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
Ответ 2 · Rody Oldenhuis
Вот ответ на ваш второй вопрос (в комментарии выше):
% 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; обычно не считается хорошей практикой задавать все вопросы, которые у вас есть, в одной ветке, потому что это затруднит поиск для любых будущих пользователей Google, которые столкнутся с теми же проблемами, что и вы.