2016-05-30 8 views
0

это может быть как эко в этом форуме, но я не мог найти решение, которое я мог бы применить к моей проблеме. У меня есть ячейка res_A1 размера (1x500), и в каждой ячейке есть вектор (длина 1x), где длина изменяется. Я хотел бы построить на одном графике каждый вектор или, может быть, несколько из них. Все линии могут быть одного цвета. Я попытался следующие, но граф не имеет смыслапостроение графика из массива ячеек различной длины

data=res_A1(1,:,end); 
plot(cell2mat(data)'); 

Кроме того, я хотел бы построить в среднем 500 векторов, предпочтительно это должно быть в том же графике в другой цвет. Есть ли хороший способ сделать это?

ответ

1

Вы можете использовать cat для объединения векторов вдоль первого измерения. Затем вы можете передать транспонирование этой матрицы в plot, и каждый столбец будет отображаться как собственный сюжет.

plot(cat(1, data{:}).'); 

Если мы создадим некоторые данные примера, это даст.

data = arrayfun(@(x)rand(1,10), ones(1, 5), 'uni', 0); 
plot(cat(1, data{:}).'); 

enter image description here

Если вы хотите специфические (т.е. [1 3 5]), вы можете заменить : выше с показателями тех, которые вы хотите.

plot(cat(1, data{[1 3 5]}).'); 

enter image description here

Если вы хотите построить в среднем, просто использовать mean на результат вызова cat.

avg = mean(cat(1, data{:}), 1); 
plot(avg); 

enter image description here

И если вы хотите его в том же участке:

alldata = cat(1, data{:}); 
avg = mean(alldata, 1); 

% Plot all of the curves 
plot(alldata.'); 

hold on 

% Plot the average curve 
plot(avg, 'LineWidth', 3, 'Color', [0.5 0.5 0.5], 'LineStyle', '--') 

enter image description here

Update

Если данные различны л engths, у вас есть два варианта, вы можете построить все с помощью цикла.

hax = axes; 
hold(hax, 'on'); 

for k = 1:numel(data) 
    plot(data{k}, 'Parent', hax); 
end 

Или вы могли бы еще попытаться объединить все в одну матрицу, отступ с NaN значений.

% Find the longest vector length 
maxlength = max(cellfun(@(x)numel(x), data)); 

alldata = nan(maxlength, numel(data)); 

for k = 1:numel(data) 
    alldata(1:numel(data{k}),k) = data{k}; 
end 

Тогда вы можете построить это и взять среднее значение с помощью nanmean.

plot(alldata); 

avg = nanmean(alldata, 2); 
+0

Это прекрасно работает с данными образца. Но мои данные имеют разную длину, поэтому я получаю сообщение «Размеры конкатенированных матриц несовместимы». – Orongo

+0

@Orongo обновлен с примером того, как обращаться с разными векторами длины. – Suever

+0

Suever работает как сон! Отлично! Большое спасибо! – Orongo

Смежные вопросы