Matlab организует и отображает данные о температуре

Относительно новичок в 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 должен быть массивом для построения.


person Croc    schedule 19.10.2012    source источник
comment
Лично я бы не стал хранить отдельный набор меток времени для каждого зонда. Учитывая, что ваш набор данных кажется относительно небольшим, у меня возникло бы искушение просто иметь один большой массив: временная метка первого столбца, температура второго столбца на зонде 1, температура третьего столбца на зонде 2 и т. д.   -  person FakeDIY    schedule 19.10.2012
comment
@FakeDIY: предполагается, что все временные метки для всех зондов равны. Если это не так, то мне кажется, что массив ячеек, который есть у OP, в порядке.   -  person Rody Oldenhuis    schedule 19.10.2012


Ответы (2)


Предполагая, что ваши местоположения не настроены так, чтобы быть ровно в 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
person Rody Oldenhuis    schedule 19.10.2012
comment
Извините, что не ответил раньше. Спасибо, это было очень полезно. - person Croc; 28.11.2012
comment
Временные метки фактически равны. Еще несколько вопросов. Я не понимаю эту строку z = cellfun(@(p)p{1}(t), data); Я использовал Z = [15; 15; 15; 15; данные{1}{2}(1); данные{2}{2}(1); и т.д.] Не очень элегантно, но делает ли это то же самое? Проблема, с которой я столкнулся сейчас, заключается в том, что показания датчиков начинаются в разное время, и для каждого датчика имеется немного разное количество показаний. Мне нужно найти первое время, общее для всех датчиков, и последнее время, общее для всех датчиков. Это должно оставить меня с равным количеством чтений при равном времени между чтениями. Как бы я это сделал? Спасибо - person Croc; 28.11.2012
comment
@Croc: И ты хочешь отказаться от остальных? Просто вырезать общие части? - person Rody Oldenhuis; 28.11.2012
comment
Да, я думаю, это было бы так - person Croc; 29.11.2012

Вот ответ на ваш второй вопрос (в комментарии выше):

% 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, которые столкнутся с теми же проблемами, что и вы.

person Rody Oldenhuis    schedule 29.11.2012