代码之家  ›  专栏  ›  技术社区  ›  MORRIJOS

获取显示值及其出现次数的数组,生成单独列出值的数组

  •  0
  • MORRIJOS  · 技术社区  · 9 年前

    我有一个数组,看起来像:

    20  1
    20  7
    45  3
    127 17
    102 1
    90  1
    64  1
    

    等…其中,左侧列显示灯光强度值,右侧列显示其出现的次数。我想要一个相应的单元格数组,它可以扩展数组,并根据每个值出现的次数分别列出每个值。同理(忽略左侧单元格列):

    []  20
    []  20
    []  20
    []  20
    []  20
    []  20
    []  20
    []  20
    []  45
    []  45
    []  45
    

    % Determine the number of 10-minute intervals for which a light level is
    % recorded (sum all the unique light levels and their repeats).  
    no_light_levels = sum(repeat_arr(:, 2));
    %
    % 'geologger_data_all' records time of each light level reading and the
    % light level.  
    geologger_data_all{no_light_levels, 2} = []; 
    geologger_data_all(1, 2) = {repeat_arr(1, 1)};
    % 
    k_out = 2;                                  % index for out arr.
    for k = 2:length(repeat_arr)
        light_level = repeat_arr(k, 1);         % grab the light level
        appears = repeat_arr(k, 2);             % does it repeat?
        if appears == 1
            geologger_data_all(k_out, 2) = {light_level};   % record
            k_out = k_out + 1; 
        elseif appears > 1
            % Record the light level for the number of times it appears.  
            geologger_data_all(k_out:(k_out + appears - 1), 2) = {light_level};
            k_out = k_out + appears;            % advance index for out arr.  
        end
    end
    %
    

    哪里 repeat_arr 看起来像这里显示的第一个格式化数组。提前感谢您的任何提示。

    1 回复  |  直到 9 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    你所拥有的基本上是 run-length-encoded data 你可以用它解码 repelem 重复每个元素指定的次数

    data = [20 1;20 7;45 3;127 17;102 1;90 1;64 1];
    out = repelem(data(:,1), data(:,2))
    

    如果你真的需要像你所展示的那样把它变成一个单元格数组,你可以添加以下步骤:

    result(:,2) = num2cell(out);
    

    如果您使用的MATLAB版本早于R2015a(之前 排斥 )您可以使用提供的解决方案 here 以获得类似的功能。