arrays - 获取显示值及其出现次数的数组,制作单独列出值的数组

标签 arrays algorithm matlab cell-array

我有一个数组,如下所示:

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 看起来像这里显示的第一个格式化数组。在此先感谢您提供任何提示。

最佳答案

你所拥有的本质上是 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(在引入 repelem 之前),您可以使用提供的解决方案 here获得类似的功能。

关于arrays - 获取显示值及其出现次数的数组,制作单独列出值的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38905051/

相关文章:

c - 来自给定数组的位 vector 实现

java - 如何在树中找到连接的道路元素

javascript - 生成两个已知点之间的坐标

java - 打印出重复的文本字段和数组中的值

C#,是否可以在没有副本的情况下将 byte* 转换为 byte[]?最快的方法是什么?

c - 如何使用C中的函数记录用户输入数字的频率

python - 如何像使用嵌套 for 循环一样迭代任意数量的列表?

python - 如何在嵌入 3D 的表面上绘制测地线曲线?

MATLAB:图形字体

algorithm - 脱毛算法开发