2015-08-06 2 views
0

Я искал способ использования boxplot для разных векторов длины. спасибо за StackOverflow помощников, они дают это решение:MATLAB boxplot больших размерных векторов разной длины

A = randn(10, 1); B = randn(12, 1); C = randn(4, 1); 
g = [repmat(1, [10, 1]) ; repmat(2, [12, 1]); repmat(3, [4, 1])]; 
figure; boxplot([A; B; C], g); 

, к сожалению, мое данные содержит более 100 векторов разной длиной, мне интересно, если это может быть сделано без повторения repmat более 100 раз.

+2

a for loop? Они предназначены для этого ... –

+0

Да, я использовал для цикла, но думал, есть ли другой способ. Thanx. –

ответ

1

Пока ваши векторы имеют разную длину, храните их в cell array.

Есть много было сделать это, вот 3 примера

1) «Наивные» for петля

g = []; 
vars_cell = {A, B, C, ....}; 

for it = 1 : length(vars_cell) 
    g = [g; repmat(it,size(vars_cell{it}))]; 
end 

Это способ сделать это работает, но очень медленно с большими кол-во в векторах или большие векторы! Это происходит из-за того, что вы переопределяете g на каждой итерации, каждый раз меняя свой размер.

2) Не наивный for петля

vars_cell = {A, B, C, ....}; 

%find the sum of the length of all the vectors 
total_l = sum(cellfun(@(x) length(x),vars_cell)); 

g = zeros(total_l,1); 
acc = 1; 

for it = 1 : length(vars_cell) 
    l = size(vars_cell{it}); 
    g(acc:acc+l-1) = repmat(it,l); 
    acc = acc+l; 
end 

Этот метод будет намного быстрее, чем 1-й, потому что она определяет g только один раз

3) "однострочника"

vars_cell = {A, B, C, ....}; 
g = cell2mat(arrayfun(@(it) repmat(it, size(vars_cell{it})),1:length(vars_cell),'UniformOutput',0)'); 

Это qute эквивалентно 2-му решению, но если вам нравится одна строка, это то, что вы ищете!

+0

Many thanx [HamtaroWarrior]. –

+0

Не забудьте проверить ответ как «принятый»;) – Ikaros

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