2

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

例如,我有被struct array调用satdata的,我想从中查看该字段SVID是否为空,所以satdata(i).SVID. 对于我的不同元素,SVID 应该从 1 到 32。但是如果有一个缺失的元素,那么它可以是[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,3,4...32].

4

2 回答 2

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));
于 2012-10-10T07:10:13.200 回答
1

你的问题在字符串中

svIdVec(i,:) = svid;

你应该用当前 svIdVec 的后面替换 i 。

可能的解决方案是

svIdVec = [];
for i = 1:32
    if isempty(satdata(i).SVID)
        continue
    else
    svid = satdata(i).SVID;
     svIdVec = [svIdVec, svid];
    end
end
于 2012-10-10T07:02:15.240 回答