首頁 > 軟體

在matlab中建立類似字典的資料結構方式

2023-03-27 06:01:29

matlab中建立類似字典的資料結構

Matlab中建立struct:

d = struct('a','1','b','2')

在Matlab中通過字串形式的fieldname來查詢value(Using Dynamic FielNames):

d.('a')
d.('b')

在Matlab中修改已經存在的field的value:

d.('b')='9'

在Matlab中新增新的field:

d.('c')='3'

在Matlab中刪除stuct的field:

d=struct('b', '9','c', '3', 'a', '1')
d=rmfield(b,'9')

在Matlab中刪除struct所有field:

d=struct()

matlab基本資料結構說明

Matlab作為早期的科研軟體之一,對資料的處理有強大的功能。最近需要做訊號處理相關的部分,將之前對Matlab不熟悉的資料操作熟悉一下。

最後準備附上Numpy中對兩者之間基本操作的比較。

1、基本資料結構總覽(僅含常用型別)

2、數值型別基本操作

2.1 資料變數的建立

doubleMatlab的預設資料型別,基本上可以滿足大部分的計算任務。single和double的建立方式一致

%% 建立陣列
x = 10;
Y = double(x);  % 轉換為double型陣列
y = 10;

%% 檢視資料型別
class(Y)

2.2 檢視資料型別和值

函數名稱函數功能
isinteger確定輸入是否為整數陣列
isfloat確定輸入是否為浮點陣列
isnumeric確定輸入是否為數值陣列
isnan確定那些陣列為NaN
class檢視資料型別

注:以上函數的返回值均為0(結果為假)或1(結果為真)

3、字元和字串

3.1 字串建立

% 建立字串
str = "Hello, world"
>>> str = 
"Hello, world"

% 建立字串陣列
str = ["Mercury" "Gemini" "Apollo";
       "Skylab" "Skylab B" "ISS"]
       
>>> str = 2x3 string
    "Mercury"    "Gemini"      "Apollo"
    "Skylab"     "Skylab B"    "ISS" 
  
% 傳入引數轉換為字串陣列
str = string(A)   % 將輸入的陣列轉換為字串陣列
str = string(A, datetFmt)   % 將傳入的A轉換指定的時間格式,所以傳入的A是datetime或者duration

A的輸入格式決定了如何將A轉換字串陣列

輸入型別轉換說明範例輸入範例輸出
char每一行變為字串的一個標量1×3 char array 'foo'1×1 string array "foo"
cell元胞陣列的每一個元素都轉換為1 * 1的字串{137,'foo'}["137" "foo"]
數值陣列相當於compose的%g格式[137 3.1e-3 8.5e-6]["137" "0.0031" "8.5e-06"]
datetime要指定格式和區域設定datetime(2020,6,1)"01-Jun-2020"
邏輯陣列logical 函數不接受字串輸入,因此轉換是單向的。logical([0 1])["false" "true"]

注:在matlab中要區分字元和字串的差異。

範例:

% A表示的是字元向量
A = 'Four score and seven years ago'
c = size(A)   
>>> c = 1×2

     1    30
str = string(A)
s = size(str)
>>> s = 1×2

     1     1
% 通過strlength可求的str中字串的長度
n = strlength(str)
>>> n = 30


% 轉換元胞陣列
A = {'Mercury','Gemini','Apollo';...
     'Skylab','Skylab B','ISS'}
>>> A = 2x3 cell
    {'Mercury'}    {'Gemini'  }    {'Apollo'}
    {'Skylab' }    {'Skylab B'}    {'ISS'   }
str = string(A)
>>> str = 2x3 string
    "Mercury"    "Gemini"      "Apollo"
    "Skylab"     "Skylab B"    "ISS" 
    
% 轉換表示數位的字串
str = ["256","3.1416","8.9e-3"]
>>> str = 1x3 string
    "256"    "3.1416"    "8.9e-3"
X = double(str)
>>> X = 1×3

  256.0000    3.1416    0.0089
Y = str2double(str)
>>>Y = 1×3

  256.0000    3.1416    0.0089

注:

1、erase可以刪除字串中的指定符號

2、str2double適用於輸入引數可能是字串陣列、字元向量或字元向量元胞陣列,本質上說明str2double對字串的轉換有更加廣泛的適用

3.2 字串陣列的存取

按照陣列存取的方式對字串進行存取,可通過下標的方式對陣列進行切片和存取。

4、結構體

結構體陣列是使用名為欄位的資料容器將相關資料組合在一起的資料型別。每個欄位都可以包含任意型別的資料。可以使用structName.fieldName 格式的圓點表示法來存取欄位中的資料。

形式上和Python的字典的建立方式類似。但是陣列的維度取決於對應值的形式,通過欄位名的方式對相應的value進行存取。

4.1 建立結構體

%% 建立一個欄位的結構體
field = 'f';
value = {'some text';
         [10, 20, 30];
         magic(5)};
s = struct(field,value)

% 檢視每個元素在內容
>>> ans = 
'some text'
ans = 1×3

    10    20    30

ans = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

%% 建立多個欄位的結構體
field1 = 'f1';  value1 = zeros(1,10);
field2 = 'f2';  value2 = {'a', 'b'};
field3 = 'f3';  value3 = {pi, pi.^2};
field4 = 'f4';  value4 = {'fourth'};

s = struct(field1,value1,field2,value2,field3,value3,field4,value4)
>>> s=1×2 struct array with fields:
    f1
    f2
    f3
    f4
% 輸出上述欄位的結果
>>> s(1)
ans = struct with fields:
    f1: [0 0 0 0 0 0 0 0 0 0]
    f2: 'a'
    f3: 3.1416
    f4: 'fourth'
>>> s(2)
ans = struct with fields:
    f1: [0 0 0 0 0 0 0 0 0 0]
    f2: 'b'
    f3: 9.8696
    f4: 'fourth'

%% 建立空欄位的結構體
s = struct('f1','a','f2',[])
>>> s = struct with fields:
    f1: 'a'
    f2: []
%% 建立包含元胞陣列的欄位
field = 'mycell';
value = {{'a','b','c'}};
s = struct(field,value)
>>> s = struct with fields:
    mycell: {'a'  'b'  'c'}

注:建立多個欄位的結構體時value2value3 的元胞陣列是 1×2 陣列,因此 s 也是 1×2 陣列。因為 value1 是數值陣列而不是元胞陣列,所以 s(1).f1s(2).f1 具有相同的內容。

類似地,因為 value4 的元胞陣列具有單一元素,所以 s(1).f4s(2).f4 具有相同的內容。

4.2 結構體中的函數

函數名稱函數功能
struct建立按結構體陣列
fieldnames結構體的欄位名稱
getfield胡哦去結構體陣列欄位
isfield確定輸入是否為結構體陣列欄位
orderfields結構體陣列的欄位順序
rmfield刪除結構體中的欄位
setfield為結構體陣列欄位賦值
table2struct將錶轉換為結構體陣列
struct2table將結構體陣列轉換為表
cell2struct將元胞陣列轉換為結構體陣列
struct2cell將結構體轉換為元胞陣列

5 元胞陣列

5.1 建立與存取

建立空字串

a = cell()
a = {}

5.2 轉換和檢查資料型別

從元胞轉換

函數名稱函數功能
cell2mat將元胞陣列轉換為普通陣列
cell2struct將元胞陣列轉換為結構體

注:

  • 元胞陣列中的結構體轉換為結構體陣列時,結構體必須包含相同的欄位(結構體的型別有點像Python中的鍵值的方式,只是存取的方式不同)

轉換為元胞

函數名稱函數功能
cellstr將字元向量轉變為元胞陣列
mat2cell將陣列轉換包含子陣列的元胞陣列.原始陣列可通過引數dimNDist劃分為更小的陣列。
num2cell將陣列轉換為相同大小的元胞陣列
struct2cell將結構體轉換為元胞陣列
table2cell將錶轉換為元胞陣列。元胞陣列中不含欄位名稱。通過fieldnames函數可以得到原始結構體的欄位名稱

5.3 元胞陣列的操作

將元胞新增到元胞陣列

C = {1, 2, 3}
>>> C=1×3 cell array
    {[1]}    {[2]}    {[3]}

C{4,4} = 44
>>> C=4×4 cell array
    {[       1]}    {[       2]}    {[       3]}    {0x0 double}
    {0x0 double}    {0x0 double}    {0x0 double}    {0x0 double}
    {0x0 double}    {0x0 double}    {0x0 double}    {0x0 double}
    {0x0 double}    {0x0 double}    {0x0 double}    {[      44]}

對元胞陣列的存取

  • 對元胞切片用圓括號()來存取
  • 使用花括號{}對特定的內容進行存取
C = {'one', 'twC=2×3 cell array
    
>>> C=2×3 cell array
    {'one'}    {'two'}    {'three'}
    {[  1]}    {[  2]}    {[    3]}   

通過()切片

upperLeft = C(1:2,1:2)
>>> upperLeft=2×2 cell array
    {'one'}    {'two'}
    {[  1]}    {[  2]}

通過切片修改值

% 修改第1行 1,2,3列的值
C(1,1:3) = {'first','second','third'}
>>> C=2×3 cell array
    {'first'}    {'second'}    {'third'}
    {[    1]}    {[     2]}    {[    3]}

將元胞中的數值資料抓換為數值陣列

numericCells = C(2,1:3)
>>> numericCells=1×3 cell array
    {[1]}    {[2]}    {[3]}
    
numericVector = cell2mat(numericCells)
>>> numericVector = 1×3

     1     2     3

通過{}對元胞的特定內容存取 / 或者修改特定內容的值

% 存取元胞的值
last = C{2,3}
>>> last = 3

C{2,3} = 300
>>> C=2×3 cell array
    {'first'}    {'second'}    {'third'}
    {[    1]}    {[     2]}    {[  300]}

存取某一行的值並儲存到數值陣列中

% 存取陣列中某一行的值並轉換為數值陣列
nums = [C{2,:}]
>>> nums = 1×3

     1     2   300

存取元胞的多級索引

myNum = [1, 2, 3];
myCell = {'one', 'two'};
myStruct.Field1 = ones(3);
myStruct.Field2 = 5*ones(5);

C = {myNum, 100*myNum;
     myCell, myStruct}
     
>>> C=2×2 cell array
    {[ 1 2 3]}    {[100 200 300]}
    {1x2 cell}    {1x1 struct   }
    
% 存取元胞的內容
C{1,2}
>>> ans = 1×3

   100   200   300
  
c{1, 2}(1, 2)
>>> ans = 2

C{2,1}{1,2}
>>> ans = 'two'

注:

  • 將元胞新增到元胞陣列內,如果當前的索引不存在,會自動對當前的陣列擴容,不存在的用空元胞來代替
  • 通過追加索引,並使用與內容的資料型別匹配的語法,來存取元胞的部分內容。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com