2

我有一个 2 列矩阵,它描述了一段数据,以及该数据在一组中出现的次数:

A = [1    6                              
     2    2
     3    8                                                                       
     4    1 
     5    3];

鉴于此,是否有一种“优雅”的方式来生成基础数据集?IE,

B = [1 1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 4 5 5 5];                                       

有很多方法可以从Bto A( tabulate,使用uniqueandhistc等),但我找不到从Ato 的任何方法B。我能做的最好的不是优雅:

B = [];
for ii = 1:size(A,1)
    B = [B repmat(A(ii,1), 1, A(ii,2))];
end

我有一个偷偷摸摸的怀疑“正确”的方法是使用bsxfunor accumarray,但我没有足够的经验来理解这些是如何工作的。

4

5 回答 5

2

您可以将 'arrayfun' 与 'cell2mat' 结合使用:

 B = cell2mat(arrayfun(@(x,y) ones(y,1)*x, A(:,1), A(:,2), 'uniformoutput', false))'

这导致

B =

  Columns 1 through 16

     1     1     1     1     1     1     2     2     3     3     3     3     3     3     3     3

  Columns 17 through 20

     4     5     5     5
于 2013-09-10T17:49:37.903 回答
2

这是另一种选择。我不会称之为优雅,但它非常有效。

ndx = cumsum([1; A(:,2)]);
B = zeros(1, ndx(end)-1);
B(ndx(1:end-1)) = 1;
B = A(cumsum(B), 1).';
于 2013-09-10T18:00:12.923 回答
1

也不是超级优雅,但这可能有效:

B = {A(:,1)*ones(1,A(:,2)};
B = [B{:}];

没有matlab来检查语法,想法是从中删除循环

B=[];
for ii=1:size(A,1)
   B=[B A(i,1)*ones(1,A(i,2)];
end;
于 2013-09-10T17:36:08.187 回答
1

这是使用的解决方案bsxfun

B = A(1+sum(bsxfun(@lt, cumsum(A(:,2)), 1:sum(A(:,2)))), 1).';
于 2013-09-10T19:45:20.777 回答
0

这类似于 H.Muster 帖子

使用repmat

B=cell2mat(arrayfun(@(x,y)(repmat(x,y,1) ), A(:,1), A(:,2), ...
                                   'UniformOutput', false));

B'是预期的输出。

于 2013-09-10T18:05:49.043 回答