Matlab中有15種基本數據類型,主要是整型、浮點、邏輯、字符、日期和時間、結構數組、單元格數組以及函數句柄等。
- 整型:(int8;uint8;int16;uint16;int32;uint32;int64;uint64)通過
intmax(class)
和intmin(class)
函數返回該類整型的最大值和最小值,例如intmax(‘int8’)=127
;
int8()有符號,占用1個字節。向無窮大方向取整:正數向正無窮大方向,負數向負無窮大方向取整。
int16():有符號,占用2個字節。向無窮大方向取整:正數向正無窮大方向,負數向負無窮大方向取整。
int32():有符號,占用4個字節。向無窮大方向取整:正數向正無窮大方向,負數向負無窮大方向取整。
int64():有符號,占用8個字節。向無窮大方向取整:正數向正無窮大方向,負數向負無窮大方向取整。
uint8():無符號,占用1個字節。向0方向取整。
uint16():無符號,占用2個字節。向0方向取整。
uint32():無符號,占用4個字節。向0方向取整。
uint64():無符號,占用8個字節。向0方向取整。
用whos觀察變量的數據類型
浮點:(single;double)
浮點數:REALMAX('double')和REALMAX('single')分別返回雙精度浮點和單精度浮點的最大值,REALMIN('double')和REALMIN ('single')分別返回雙精度浮點和單精度浮點的最小值。
Matlab 取整函數有: fix, floor, ceil, round.
fix 朝零方向取整,fix(-1.3)=-1; fix(1.3)=1;
floor 朝負無窮方向取整,floor(-1.3)=-2; floor(1.3)=1;
ceil 朝正無窮方向取整,ceil(-1.3)=-1; ceil(1.3)=2;
round 四舍五入到最近的整數,round(-1.3)=-1;round(-1.52)=-2;
1.000 處理成 1 用 floor round fix 都行 但如果是去掉尾巴的取整,用 floor邏輯:(logical)
函數logical()將數值型數據轉換成邏輯型數據。
下例是邏輯索引在矩陣操作中的應用,將5*5矩陣中大于0.5的元素設定為0:A = rand(5); A(A>0.5)=0
;字符: (char)
Matlab中的輸入字符需使用單引號。字符串存儲為字符數組,每個元素占用一個ASCII字符。如日期字符:DateString=’9/16/2001’
實際上是一個1行9列向量。構成矩陣或向量的行字符串長度必須相同。
可以使用char函數構建字符數組,使用strcat函數連接字符。
例如,命令name = ['abc' ; 'abcd']
將觸發錯誤警告,因為兩個字符串的長度不等,此時可以通過空字符湊齊如:name = ['abc ' ; 'abcd']
,更簡單的辦法是使用char函數:char(‘abc’,’abcd’)
,Matlab自動填充空字符以使長度相等,因此字符串矩陣的列緯總是等于最長字符串的字符數.
例如size(char(‘abc’,’abcd’)) 返回結果[2,4]
,即字符串’abc’實際存在的是’abc ’,此時如需提取矩陣中的某一字符元素,需要使用deblank函數移除空格如name =char(‘abc’,’abcd’); deblank(name(1,:))
。
此外,Matlab同時提供一種更靈活的單元格數組方法,使用函數cellstr可以將字符串數組轉換為單元格數組:
->? 4
cdata=cellstr(data) length(cdata{1})
->?3```
**常用的字符操作函數**
blanks(n) 返回n個空字符
deblank(s) 移除字符串尾部包含的空字符
(string) 將字符串作為命令執行
findstr(s1,s2) 搜索字符串
ischar(s) 判斷是否字符串
isletter(s) 判斷是否字母
lower(s) 轉換小寫
upper(s) 轉換大寫
strcmp(s1,s2) 比較字符串是否相同
strncmp(s1,s2,n) 比較字符串中的前n個字符是否相同
strrep(s1,s2,s3) 將s1中的字符s2替換為s3
int2str 將整數轉換為字符串
lower 把字符串變成小寫
mat2str 將數組轉換為字符串
num2str 把數值轉換為字符串
strcat 把多個串連接成長串
strcmp 比較字符串
strcmpi 比較字符串(忽略大小寫)
strings MATLAB 中的字符串
strjust 字符串的對齊方式
strmatch 逐行搜索串
strnomp 比較字符串的前N 個字符
strncmpi 比較字符串的前N 個字符(忽略大小寫)
strrep 用另一個串代替一個串中的子串
strtok 刪除串中的指定子串
strvcat 創建字符串數組
str2mat 將字符串轉換為含有空格的數組
str2num 將字符串轉換為數值
5. 日期和時間
Matlab提供三種日期格式:日期字符串如’1996-10-02’,日期序列數如729300(0000年1月1日為1)以及日期向量如 1996 10 2 0 0 0,依次為年月日時分秒。
**常用的日期操作函數**
datestr(d,f) 將日期數字轉換為字符串
datenum(str,f) 將字符串轉換為日期數字
datevec(str) 日期字符串轉換向量
weekday(d) 計算星期數
eomday(yr,mth) 計算指定月份最后一天
calendar(str) 返回日歷矩陣
clock 當前日期和時間的日期向量
date 當前日期字符串
now 當前日期和時間的序列數
6. 結構
結構是包含已命名“數據容器”或字段的數組。結構中的字段可以包含任何數據。
**構建結構數組**
(1) 賦值方法
下面的賦值命令產生一個名為patient的結構數組,該數組包含三個字段:
`patient.name = 'John Doe';
patient.billing = 127.00;
patient.test = [79 75 73; 180 178 177.5; 220 210 205];
%在命令區內輸入patient可以查看結構信息:
name: 'John Doe'billing: 127test: [3x3 double]
%繼續賦值可擴展該結構數組:
patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68 70 68; 118 118 119; 172 170 169];
賦值后結構數組變為[1 2]。`
(2) 構建結構數組:struct函數 函數基本形式為:
`strArray = struct('field1',val1,'field2',val2, ...)`
例如:
`weather(1) = struct('temp', 72,'rainfall', 0.0);
weather(2) = struct('temp', 71,'rainfall', 0.1);
weather = repmat(struct('temp', 72, 'rainfall', 0.0), 1, 3);
weather = struct('temp', {68, 80, 72}, 'rainfall', {0.2, 0.4, 0.0});`
(3) 訪問結構數據
以下都是合法的結構數組訪問命令:
mypatients = patient(1:2) 獲取子結構數據
mypatients(1) 訪問結構數據
patient(2).name 訪問結構數據中的特定字段
patient(3).test(2,2) 訪問結構數據中的特定字段(該字段為數組)
bills = [patient.billing] 訪問多個結構
tests = {patient(1:2).test} 提取結構數據轉換成單元格數組
**使用結構字段的動態名稱**
通過structName.(expression_r_r_r)可以賦予結構字段名稱并訪問數據。例如字段名為expression_r_r_r、結構名為structName,訪問其中第7行1至25列數據可以使用命令:`structName.(expression_r_r_r)(7,1:25)`。
例如,存在一個學生每周成績數據結構數組,其數據通過以下方式建立:
`testscores.wang.week(1:25) = ...
[95 89 76 82 79 92 94 92 89 81 75 93 ...
85 84 83 86 85 90 82 82 84 79 96 88 98];
testscores.chen.week(1:25) = ...
[87 80 91 84 99 87 93 87 97 87 82 89 ...
86 82 90 98 75 79 92 84 90 93 84 78 81];`
即結構名為testscores,字段使用每個學生的名稱命名,分別為wang和chen,每個學生下面包含名為week的成績結構數組。
現計算給定結構名稱、學生名稱和起止周數的平均分數。
在命令窗口中輸入 edit avgscore.m,輸入以下代碼后保存文件:
`function avg = avgscore(struct, student, first, last)
avg = sum(struct.(student).week(first:last))/(last - first + 1);`
在命名窗口中輸入:avgscore(testscores, 'chen', 7, 22) 計算學生陳從第7周到第22周的平均分數。
(4) 添加和刪除結構字段
命令[struct](index).(field)可添加或修改字段。
如`patient(2).ssn = '000-00-0000' `在結構patient中添加一個名為ssn的字段。
刪除字段使用rmfield函數,如patient2 = rmfield(patient, 'name') 刪除name字段并產生新的結構。
* 單元格數組:(cell)
單元格數組提供了不同類型數據的存儲機制,可以儲存任意類型和任意緯度的數組。
訪問單元格數組的規則和其他數組相同,區別在于需要使用花括號{}訪問,例如A{2,5}訪問單元格數組A中的第2行第5列單元格。
(1) 構建單元格數組:賦值方法
使用花括號標識可直接創建單元格數組,如:
`A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
A(1,2) = {'abcd'};
A(2,1) = {3+7i};
A(2,2) = {-pi:pi/10:pi};`
上述命令創建2\*2的單元格數組A。繼續添加單元格元素直接使用賦值如A(2,3)={5}即可,注意需使用花括號標識。簡化的方法是結合使用花括號{單元格數組}和方括號[]創建,
如`C = {[1 2], [3 4]; [5 6], [7 8]};`
(2)構建單元格數組:函數方法Cell函數。
如:`B = cell(2, 3);B(1,3) = {1:3};`
(3)訪問數據
通過索引可直接訪問單元格數組中的數據元素,例如:
`N{1,1} = [1 2; 4 5];
N{1,2} = 'Name';
N{2,1} = 2-4i;
N{2,2} = 7;
c = N{1,2}
d = N{1,1}(2,2)`
* 函數句柄
函數句柄是用于間接調用一個函數的Matlab值或數據類型。在調用其它函數時可以傳遞函數句柄,也可在數據結構中保存函數句柄備用。通過命令形式 `fhandle = @functionname `可以創建函數句柄
例如` trigFun=@sin`,或匿名函數`sqr = @(x) x.^2;`。
使用句柄調用函數的形式是
` fhandle(arg1, arg2, ..., argn) 或 fhandle()(無參數)`。
如:trigFun(1)。
例:
function x = plotFHandle(fhandle, data)plot(data, fhandle(data))
plotFHandle(@sin, -pi:0.01:pi)
%數據類型轉換,如C語言中的強制類型轉換相似
y=9;
z=double(y);
9. 圖像數據類型
**Matlab中的圖像數據類型轉換**
MATLAB中讀入圖像的數據類型是uint8,而在矩陣中使用的數據類型是double因此 I2=im2double(I1) :把圖像數組I1轉換成double精度類型;如果不轉換,在對uint8進行加減時會產生溢出,可能提示的錯誤為:
`Function '*' is not defined for values of class 'uint8'。`
# 數據類型轉換
## 一、數字轉字符
1. char()
注意,char()使用的是ASCII編碼。
* num2str(k)
將數字轉換成字符串
* int2str(k)
將整數型轉換為字符串
* mat2str(k)
將矩陣轉換為字符串,供eval使用
* str2double(S)
將字符串數組轉化為數值數組
* sprintf
將數據格式化為字符串
str = sprintf(formatSpec,A1,...,An)
[str,errmsg] = sprintf(formatSpec,A1,...,An)
formatSpec 部分與fprintf一致。
> fprintf與sprintf有個使用的區別需要注意
fprintf 會直接顯示出來,而sprintf是形成字符串,需要用disp輸出到屏幕。
fprintf需要使用‘\n’來字符串輸出的結束。sprintf不需要。
## 二、字符轉數字
1. double
* str2num
* str2double
## 三、數字格式間轉換
logical, char,int8,uint8,int16,uint16,int32,uint32,int64,uint64,single,double
想要轉化成特定類型,就用該類型作為函數.比如說double(X) int64(X)
1. base2dec X進制串轉換為十進制整數
* bin2dec 二進制串轉換為十進制整數
* dec2base 十進制整數轉換為X 進制串
* dec2bin 十進制整數轉換為二進制串
* dec2hex 十進制整數轉換為16 進制串
* findstr 在一個串中尋找一個子串
* hex2dec 16進制串轉換為十進制整數
* hex2num 16進制串轉換為浮點數
## 四、圖像數據類型轉換函數
默認情況下,matlab將圖像中的數據存儲為double型,即64位浮點數;matlab還支持無符號整型(uint8和uint16);uint型的優勢在于節省空間,涉及運算時要轉換成double型。
1. im2double()
將圖像數組轉換成double精度類型
* im2uint8()
將圖像數組轉換成unit8類型
> 在數據類型轉換時候uint8和im2uint8的區別,uint8的操作僅僅是將一個double類型的小數點后面的部分去掉;
但是im2uint8是將輸入中所有小于0的數設置為0,而將輸入中所有大于1的數值設置為255,再將所有其他值乘以255。
* im2uint16()
將圖像數組轉換成unit16類型
# 執行代碼
* 執行字符串
eval
eval(expression)
[output1,...,outputN] = eval(expression)
eval(['xxxxx',variable,'xxxxxxxx;'])
eval(strcat('xxxxx',variable,'xxxxxxxx;'))
* 執行函數
feval