1. 程式人生 > >關於Matlab下的cell元胞與struct結構體

關於Matlab下的cell元胞與struct結構體

結構體資料型別可以把不同資料型別的變數放到同一個變數名下,通過不同“域”的概念對結構體中的不同資料進行賦值‘操作。結構體中的資料儲存在相應的“域”中。

結構體的建立主要通過命令列直接賦值法和函式法。

1. 命令列直接賦值法

>>s.str='ABC';

>>s.num='[1:7];

>>s.mat=magic(3);

2 函式法

s=struct('str','ABC','num',[1:7],'mat',magic(3))

元胞陣列是由可以包括任何資料型別的元胞組成的陣列。通過元胞陣列的使用,可以在同一個變數中儲存不同資料型別的資料。

元胞陣列的建立方法主要有直接賦值法和函式法。

1. 直接賦值法

>>a{1,1}=7;

>>a{1,2}='ABC';

>>a{2,1}=magic(3);

>>a{2,2}=logical(ones(3));

2. 函式法

>>a=cell(m,n);

>>a={7;'ABC';magic(3);logical(ones(3))}

元胞cell與結構體struct相互賦值之間為了型別一致,有時需要cell2struct或struct2cell,或對元胞的元胞或結構體的結構體需要用cellfun或structfun。但只要在賦值時正確使用()和{}便不需要使用這些函式進行轉換。如下所示:

metric_dist={};
for i=1:length(dist.label)
    metric_dist{i}.label=dist.label(i);
    metric_dist{i}.ind=dist.ind(i);
    metric_dist{i}.name=dist.name(i);
    
end

p_distance=metric_dist;

得到的p_distance如下:

現把程式碼只作()或{}修改如下:

metric_dist={};
for i=1:length(dist.label)
    metric_dist(i).label=dist.label(i);
    metric_dist(i).ind=dist.ind(i);
    metric_dist(i).name=dist.name(i);
    
end

p_distance=metric_dist;

此時,p_distance變成了結構體,如下所示:



現把程式碼再修改為如下:

metric_dist={};
for i=1:length(dist.label)
    metric_dist{i}.label=dist.label{i};
    metric_dist{i}.ind=dist.ind{i};
    metric_dist{i}.name=dist.name{i};
    
end

p_distance=metric_dist;
此時,p_distance也是結構體:


這裡看上去和第一段程式碼結果一樣,但具體到結構體記憶體儲的內容,還是有差別的,這只是元胞cell對()取元胞單元,對{}取元胞內容的差別。