Как я могу проверить наличие пустых полей в массиве структур в Matlab и сохранить все непустые векторы?

У меня есть 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].


person Aldo Sanchez    schedule 10.10.2012    source источник


Ответы (2)


Вам не нужен цикл:

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));
person Gunther Struyf    schedule 10.10.2012

Ваша проблема в строке

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
person Danil Asotsky    schedule 10.10.2012