2014-11-07 3 views
0

Matlab код:проверка с Matlab, если объект exsting

for n = 1:length(data) 

    if exist('data{n}.sid') 
     array{n} = data{n}.sid 
    else 
     array{n} = 0 
    end 

end 

Результат:

array = 

    [0] [0] [0] [0] [0] [0] [0] 

Но в первой и второй структуры из "данных", то "hk1" , соответственно. «hk1.sid» существует и содержит «1»!

Как я должен изменить свой код, что массив выглядит следующим образом ...

array = 

    [1] [1] [0] [0] [0] [0] [0] 

Содержание данных:

>> data 

data = 

    [1x1 struct] [1x1 struct] [1x1 struct] [1x1 struct] [1x1 struct] [1x1 struct] [1x1 struct] 

>> data{2} 

ans = 

    sid: 1 
    hk1: [1x1 struct] 

>> data{4} 

ans = 

      pack_id: [1x1 struct] 
    pack_seq_ctrl: [1x1 struct] 

Как вы видите, данные {2 } включает в себя «sid», но данные {4} не включают в себя «sid» ...

+0

Конечно, см. Обновление «Содержание данных» выше. Постскриптум Я написал что-то не так: remove hk1. Но это все еще не работает. – Kevin

ответ

2

Вместо exist('data{n}.sid') используйте isstruct(data{n}) && isfield(data{n}, 'sid').

exist пытается проверить, существует ли переменная, которая буквально называется data{n}.sid. Это не допустимое имя переменной, поэтому оно всегда возвращает false, и вы никогда не дойдете до состояния, которое вам нужно.

+0

Привет, Сэм, спасибо, что работает отлично! Но, предполагая, что хочу проверить один уровень глубже: data {n} .hk1.mode, как мне изменить код? Это означает, что я хочу извлечь содержимое «режима», если hk1 и режим доступны. – Kevin

+0

@Kevin Для этого попробуйте другой код решения после изменения 'sid' в' mode' в этом коде? – Divakar

+0

Вам нужно использовать 'isstruct (data {n}) && isfield (data {n}), 'hk1') && isstruct (data {n} .hk1) && isfield (data {n} .hk1, 'mode «)'. –

0

Посмотрите, подходит ли этот isfield + cellfun для вас -

fn1 = 'hk1' %// stage1 search fieldname 
fn2 = 'sid' %// stage2 search fieldname 

%// logical array, where 1s mean first stage fieldname 'hk1' exists in data struct 
stage1_matches = cellfun(@(x) isfield(x, fn1),data) 

%// get the actual indices as we will need these later on 
stage1_idx = find(stage1_matches) 

%// logical array, where 1s indicate second stage fieldname 'sid' exists in 
%// data.hk1 struct 
stage2_matches = cellfun(@(x) isfield(x.hk1,fn2),data(stage1_matches)) 

%// find the indices from stage1_idx where 'sid' fieldname is not present 
%// and index into the logical array of stage1_matches to set those as zeros 
%// and thus we have the desired output 
stage1_matches(stage1_idx(~stage2_matches)) = 0 
Смежные вопросы