Extracting variables from a struct array with many empty structs

I have a giant struct array and many of which are empty.
struct array with fields: f1, f2, f3. i.e. Struct Array: StAr(i,j) has StAr(i,j).f1, StAr(i,j).f2,StAr(i,j).f3. But I want to create a new Array by just collecting all the f1 values without using a for loop.
(1) Since many of the structs in the array are empty when I do [StrAr.f1] it gives me a row vector from the non-empty structs. How do I substitute the empty struct values with 0 instead of a matrix.
or
(2) Just get the index of non-empty structs?
Thanks guys

답변 (1개)

Andrei Bobrov
Andrei Bobrov 2012년 10월 23일
편집: Andrei Bobrov 2012년 10월 24일
k = {StAr.f1};
out = zeros(size(k));
nonempty = ~cellfun(@isempty,k);
out(nonempty) = [StAr.f1]; % (1)
idx = find(nonempty); % (2)
EDIT
k = {StAr.f1};
k1 = cellfun(@(x)x(:).',k,'un',0);
ii = cellfun(@isempty,k1);
k1(ii) = {0};
out = cell2mat(k1); % (1)
idx = find(ii); % (2)
EDIT 2
k = reshape({StAr.f1},size(StAr));
k2 = cellfun(@(x)x(:).',k,'un',0);
ii = cellfun(@isempty,k2);
k2(ii) = {nan};
s2 = cellfun('size',k2,2);
out = cell2mat(cellfun(@(x,y)[x,nan(1,y - numel(x))],...
k2,num2cell(ones(size(s2,1),1)*max(s2)),'un',0));

댓글 수: 4

I forgot to mention that f1, f2, f3 can are vectors of varying length for various (i,j). i.e. for some (i,j) f1 can be 1x3 and for another (i,j) it can be 1x25.
How should I modify the above code?
Thanks
In this step: k = {StAr.f1};
the original array structure is flattened out to be a row vector. Can I preserve the array structure and keep it m x n. I am not great with Matlab so please excuse my silly questions.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

태그

질문:

2012년 10월 23일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by