如何在MATLAB中找到struct数据类型的含义?

时间:2014-12-27 07:02:35

标签: matlab

我想找到图像的偏心率。

 img = imread('47.jpg');
    ecc=regionprops(img,'Eccentricity');
    ecc = 

    255x1 struct array with fields:
        Eccentricity

    ecc(255)

    ans = 

        Eccentricity: 0.2851

    ecc(1)

    ans = 

        Eccentricity: 0.4740

========================= ecc是struct数据类型的变量。它将保存所有255个对象的值。但是,我想找到一个偏心率并考虑所有这些值的平均值。

有没有办法找到结构值的平均值?

我试过循环。计算总和除以总数。对象但是MATLAB不允许对struct data varible进行添加。

=======================================

    img = imread('47.jpg');
    ecc=regionprops(img,'Eccentricity');
    numObj = numel(ecc);
    sum=0;
    index=1;
    for k = 1: numObj
        temp=ecc(index);
        **sum=temp+sum;**
        index=k+1;
    end
    imgEcc = sum/numObj;
**??? Undefined function or method 'plus' for input arguments of type 'struct'.**

===========================================

请提供您的意见。

1 个答案:

答案 0 :(得分:0)

字段中的标量数据

在循环中,您必须引用字段名称来访问数据:

for k = 1: numObj
    temp=ecc.Eccentricity(index);
    sum=temp+sum;
    index=k+1;
end
imgEcc = sum/numObj;

更有效的方法是使用ecc.Eccentricity本身是以逗号分隔的值列表的事实从结构数组中提取所有偏心率:

Eccentricities = [ecc.Eccentricity]; 

这与Matlab处理结构数组的方式类似[ecc(1).Eccentricity, ecc(2).Eccentricity,...]。 由于偏心率现在是双数组,因此您可以使用mean

EccentricityBar = mean(Eccentricities);


字段中的数组数据

如果struct数组中的数据不是标量,则值提取的语义取决于字段中数据的形状。 无论字段数据是行向量(1xN),列向量(Nx1)还是矩阵(MxN),通过将字段引用包装在正方形中形成的矩阵大括号总是由逗号分隔的连接组成。 换句话说,如果我们有一个带有字段foo的结构数组bar,则以下两行是等效的:

baz1 = [foo(1:3).bar];
baz2 = [foo(1).bar,foo(2).bar,foo(3).bar];

要访问baz数组的某些元素,需要了解foo(k).bar中数据的形状。 如果数据是长度为N的行向量,则可以使用下标和步幅N来提取struct数组中的原始列:

col1 = baz(1:N:end);
col2 = baz(2:N:end);
...
col# = baz(#:N:end);

如果数据是长度为N的列向量,则struct数组中的原始行是baz的行:

row1 = baz(1,:);
row2 = baz(2,:);
...
row# = baz(#,:);

对于矩阵数据,上述两种方法的组合可以在哪里查看。

例如,如果您的结构数组data的字段Centroidx中具有y1x2 array质心位置,那么我们可以提取像

这样的值
centroids = [data.Centroid];
xbar      = centroids(1:2:end);
ybar      = centroids(2:2:end);

然而,如果质心位置是2x1 array,我们会像

一样提取
centroids = [data.Centroid];
xbar      = centroids(1,:);
ybar      = centroids(2,:);