2013-05-02 19 views
7

Moje pytanie brzmi: Jaka jest różnica między S a S(:), jeśli S jest pustą strukturą.Różnica między pustą strukturą Matlab S i wszystkimi elementami S (:)

wierzę, że istnieje różnica ze względu na to pytanie: Adding a field to an empty struct

Minimal przykład ilustrujący:

S = struct(); %Create a struct 
S(1) = []; %Make it empty 
[S(:).a] = deal(0); %Works 
[S.b] = deal(0); %Gives an error 

Błąd podane:

przypisanie

Kropka nazwa struktura jest nielegalne, gdy struktura jest pusta. Użyj indeksu dolnego w strukturze .

Odpowiedz

4

[S(:).b] = deal(0) jest odpowiednik [S(1:end).b] = deal(0), który rozwija się do [S(1:numel(S)).b] = deal(0) lub, w twoim konkretnym przypadku, [S(1:0).b] = deal(0). W związku z tym nie należy się spodziewać żadnych elementów struktury, które spodziewałbym się wykonać, chociaż nadal uważam za nieco zaskakujące, że doda to pole b. Może to właśnie ta dziwaczność, do której dostęp można uzyskać tylko przez jednoznaczne określenie listy pól, która jest przechwytywana przez błąd.

Pamiętaj, że jeśli chcesz, aby utworzyć pustą strukturę z pola b, można alternatywnie napisać

S(1:0) = struct('b',pi) %# pie or no pie won't change anything 

choć daje to strukturę 0x0.

7

W rzeczywistości, tu jest inny dziwne dla ciebie:

>> S = struct('a',{}, 'b',{}) 
S = 
0x0 struct array with fields: 
    a 
    b 

>> [S(:).c] = deal() 
S = 
0x0 struct array with fields: 
    a 
    b 
    c 

>> S().d = {}   %# this could be anything really, [], 0, {}, .. 
S = 
0x0 struct array with fields: 
    a 
    b 
    c 
    d 

>> S = subsasgn(S, substruct('()',{}, '.','e'), {}) 
S = 
0x0 struct array with fields: 
    a 
    b 
    c 
    d 
    e 

>> S = setfield(S, {}, 'f', {1}, 0) 
S = 
0x0 struct array with fields: 
    a 
    b 
    c 
    d 
    e 
    f 

Teraz część zabawy, odkryłem sposób na awarię MATLAB (testowane na R2013a):

%# careful MATLAB will crash and your session will be lost! 
S = struct(); 
S = setfield(S, {}, 'g', {}, 0) 
+3

Niezły! Ponadto potwierdzam błąd seg-fault na R2012b i R2012a – Jonas

+0

Po prostu wypróbowałem to na Matlab 2014b i nadal się zawiesza. Zabawa. –

+1

nie ulega awarii już w 2015b i 2016b. –

0

Faktycznie różnica między S i S(:) dotyczy ogólnie struktur, a nie tylko pustych struktur.

Jednym z powodów takiego stanu rzeczy jest to, że pozwala ci wybrać, czy chcesz uzyskać dostęp do struktury lub jej zawartości.

Praktycznym przykładem byłoby przypisanie [] w celu usunięcia coś:

S = struct(); 
T = struct(); 

S(:) = []; % An empty struct with all fields that S used to have 
T = []; % Simply an empty matrix 

S jest obecnie pusty struct, ale nadal będzie zawierać wszystkie pola, które go wcześniej.

T z drugiej strony stała się po prostu pustą matrycą [].

Oba działania robią to, czego można się spodziewać, a to nie byłoby możliwe bez rozróżnienia między strukturą i wszystkimi jej elementami.

+0

Podczas sprawdzania, w jaki sposób to generalizuje, natknąłem się na to: http: // stackoverflow.com/questions/18959702/Różnica między pierwszymi elementami macierzy 1x1-macierz-i-wszystkich-elementów-1x-matrycy –

Powiązane problemy