如何在Matlab中检查结构数组中的空字段并存储所有非空的向量?

时间:2012-10-10 06:46:46

标签: matlab is-empty

我有32x1 struct array。该数组的每个元素都有几个字段。我试图检查哪些元素是空的(完成),但后来我想创建一个包含所有非空元素的向量。

例如,我有一个名为struct array的{​​{1}},我想看看字段satdata是否为空,所以SVID。对于我的不同元素,SVID应该从1到32。但是如果缺少元素,那么它可以是satdata(i).SVID。所以我想创建一个列向量(对于这种情况)

[1:4 6:10 11:32]

这是我到目前为止所做的:

[1;2;3;4;6;7;8;9;10;11;12;13;14;15;16;17;18;19...32].

哪个正确检查空插槽,但是当我创建向量时,我得到的内容看起来像for i = 1:32 if isempty(satdata(i).SVID) continue else svid = satdata(i).SVID; svIdVec(i,:) = svid; end end 。在这种情况下,只有第一个元素为空。因此,我想获得一个svIdVec = [0,2,3,4...32]向量,例如31x1

2 个答案:

答案 0 :(得分:5)

您不需要循环:

svIdVec = {satdata.SVID};
[svIdVec{~cellfun(@isempty,svIdVec)}]'; % select only the non-empty values

如果SVID字段是一个向量,并且您想要在矩阵中聚合它,则应使用以下内容(上面的代码用于标量不能用于处理向量):

svIdVec = {satdata.SVID}';
svid = ~cellfun(@isempty,svIdVec );
svIdVec = cell2mat(svIdVec(svid));

答案 1 :(得分:1)

您的问题在字符串

svIdVec(i,:) = svid;

你应该用当前的svIdVec替换我。

可能的解决方案是

svIdVec = [];
for i = 1:32
    if isempty(satdata(i).SVID)
        continue
    else
    svid = satdata(i).SVID;
     svIdVec = [svIdVec, svid];
    end
end