我一直在寻找一种方法来将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多次。
答案 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)');
这相当于第二种解决方案,但是如果你喜欢一行答案,这就是你要找的东西!