2

私は持ってい32x1 struct arrayます。この配列の各要素には、いくつかのフィールドがあります。どの要素が空(完了)であるかを確認しようとしていますが、空ではなかったすべての要素を含むベクトルを作成したいと思います。

たとえば、struct arrayという名前があり、そこからフィールドが空かsatdataどうかを確認したいので、 。SVIDは、私のさまざまな要素に対して1から32までの範囲である必要があります。ただし、欠落している要素がある場合は、である可能性があります。したがって、(この場合は)次のような列ベクトルを作成します。SVIDsatdata(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,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;

ここでiを現在のsvIdVecの後ろに置き換える必要があります。

考えられる解決策は

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 に答える