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

从结构创建直方图

  •  0
  • am304  · 技术社区  · 5 年前

    我有一个八度音阶(v5.1.0)的结构,如下所示:

    >> cal_data
    cal_data =
    
      scalar structure containing the fields:
    
        OG_0100 =
    
            0.045260  -62.422000    0.044310  -60.768600
            0.045000  -61.576600    0.044620  -61.303400
    
        OG_0101 =
    
            0.044950  -61.316900    0.044110  -59.609500
            0.045150  -62.235500    0.044380  -61.260800
    
        OG_0102 =
    
            0.045160  -61.609900    0.044550  -61.759800
            0.044950  -61.725800    0.044480  -61.062300
    

    等。。。字段的名称递增到 OG_0280 . 每个字段都是相同的,由一个2x4的双精度数组组成。

    我试过以下方法,但没有效果:

    >> hist([cal_data])
    
    error: hist: Y must be real-valued
    error: called from
        hist at line 90 column 5
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Cris Luengo    5 年前

    因为每个struct元素的大小都相同,所以将它们存储为单个3D数组将更加高效和灵活。此代码将当前结构转换为以下数组:

    cal_data.OG_0100 = [
            0.045260  -62.422000    0.044310  -60.768600
            0.045000  -61.576600    0.044620  -61.303400];
    cal_data.OG_0101 = [
            0.044950  -61.316900    0.044110  -59.609500
            0.045150  -62.235500    0.044380  -61.260800];
    cal_data.OG_0102 = [
            0.045160  -61.609900    0.044550  -61.759800
            0.044950  -61.725800    0.044480  -61.062300];
    
    data = struct2cell(cal_data);
    data = reshape(data,1,1,[]);
    data = cell2mat(data);
    

    data(:,:,1) cal_data.OG_0100 . 等。

    然后,可以通过首先重塑为二维矩阵来为每个值生成直方图,其中每列是一个值,每行是一个观察值(这需要转置)。但是,由于每个值的范围非常不同,单个直方图可能并不理想。最好只画8个独立的直方图。

    data = reshape(data,[],size(data,3)).';
    hist(data)