不同长度

时间:2015-08-06 11:35:56

标签: matlab boxplot

我一直在寻找一种方法来将boxplot用于不同长度的矢量。对于stackoverflow助手,他们给出了这个解决方案:

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多个不同长度的矢量,我想知道是否可以在不重复使用重复数据的情况下完成100多次。

1 个答案:

答案 0 :(得分: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

此方法比第一个方法快得多,因为它只定义g一次

3)“一线”

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

这相当于第二种解决方案,但是如果你喜欢一行答案,这就是你要找的东西!