从结构创建直方图

Create histogram from struct

我在 Octave (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 的双精度数组组成。

我想为结构中所有字段的 8 个值中的每一个创建一个直方图,但遇到了问题。

我尝试了以下方法,但无济于事:

>> hist([cal_data])

error: hist: Y must be real-valued
error: called from
    hist at line 90 column 5

因为每个结构元素的大小都相同,所以将它们存储为单个 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)