matlab强制数据类型转换
>> x=uint8(8);
>> class(x) %查看類型
ans =
uint8
>> y=double(x); %轉雙精度
>> class(y)
ans =
double
?
Matlab中有15種基本數據類型,主要是整型、浮點、邏輯、字符、日期和時間、結構數組、單元格數組以及函數句柄等。
????????1、整型:(int8;uint8;int16;uint16;int32;uint32;int64;uint64)通過intmax(class)和intmin(class) 函數返回該類整型的最大值和最小值,例如intmax(‘int8’)=127;
????????2、浮點:(single;double)
? ? ? ? ?浮點數:REALMAX('double')和REALMAX('single')分別返回雙精度浮點和單精度浮點的最大值,REALMIN('double')和REALMIN ('single')分別返回雙精度浮點和單精度浮點的最小值。
? ? ? ?3、邏輯:(logical)
Logical:下例是邏輯索引在矩陣操作中的應用,將5*5矩陣中大于0.5的元素設定為0:
??????? ? ? A = rand(5);A(A>0.5)=0;
? ? ? ? ?4、字符:(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可以將字符串數組轉換為單元格數組:
data= char(‘abc’,’abcd’)
???????length(data(1,:))?->? 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
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、結構
結構是包含已命名“數據容器”或字段的數組。結構中的字段可以包含任何數據。
7、構建結構數組
(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: 127
test: [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字段并產生新的結構。
8、單元格數組:(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)
9、函數句柄
函數句柄是用于間接調用一個函數的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語言中的強制類型轉換相似e.g.:
y=9;
z=double(y);
???Matlab中的圖像數據類型轉換
MATLAB中讀入圖像的數據類型是uint8,而在矩陣中使用的數據類型是double因此 I2=im2double(I1) :把圖像數組I1轉換成double精度類型;如果不轉換,在對uint8進行加減時會產生溢出,可能提示的錯誤為:Function '*' is not defined for values of class 'uint8'。
??
?圖像數據類型轉換函數
默認情況下,matlab將圖像中的數據存儲為double型,即64位浮點數;matlab還支持無符號整型(uint8和uint16);uint型的優勢在于節省空間,涉及運算時要轉換成double型。
????im2double():將圖像數組轉換成double精度類型
?????im2uint8():將圖像數組轉換成unit8類型
?????im2uint16():將圖像數組轉換成unit16類型
?
//
?
%假設你的文件名在c盤 叫test.txt fid=fopen('c:\test.txt'); data=textscan(fid,'%s','delimiter','\n');%把數據按行讀入 fclose(fid);%關閉文件 data=data{1,1}; A=textscan(data{1},'%n','delimiter',' ');把第一行按空格為分割賦給A B=textscan(data{2},'%n','delimiter',' ');同上B C=textscan(data{3},'%n','delimiter',' ');同上C A=A{1};B=B{1};C=C{1};把A,B,C由cell轉成向量 %這樣的話無論這三行分別有多少個數據都可以的。 截取字符串部分:str(2:length(str)-1))總結
以上是生活随笔為你收集整理的matlab强制数据类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab的input函数总结
- 下一篇: matlab人脸追踪,求大神帮助我这个菜