78
字字字字 Character Array 创创创创创创 一、 创创创创创创创创创创创创创 创创创创创创创创创 创创创创创创创 创创创创创创创 创创创创创创创创创创 创创创创创创创创创创创创创创创创创 、。 MATLAB 创 创创创 string 创创创创创创创创创创创 创创创创 创创创创创创创 创创 创创创创创创创创 ,一 创创创创创创创创创创创

字符数组 Character Array

Embed Size (px)

DESCRIPTION

字符数组 Character Array.   字符串在数据的可视化、应用程序的交互等方面有重要的作用。 MATLAB 中,字符串 ( string ) 是作为 字符数组 来引入的。字符串按 行向量 进行存储,每一字符以其在字符集中的内部编码的形式存放。. 一、创建字符数组 二、字符数组在绘图中的简单应用 三、字符数组的基本操作 四、字符串元胞数组 五、常用字符串函数. 一、创建字符数组. 1 、 用单引号对 ’ ’ 创建字符串(一维字符数组). 必须将待建字符串放在 单引号对 中; 每个字符占一个元素位,两个字节; - PowerPoint PPT Presentation

Citation preview

Page 1: 字符数组 Character Array

字符数组Character Array

一、创建字符数组二、字符数组在绘图中的简单应用三、字符数组的基本操作四、字符串元胞数组五、常用字符串函数

  字符串在数据的可视化、应用程序的交互等方面有重要的作用。 MATLAB 中,字符串( string )是作为字符数组来引入的。字符串按行向量进行存储,每一字符以其在字符集中的内部编码的形式存放。

Page 2: 字符数组 Character Array

1 、 用单引号对 ’ ’ 创建字符串(一维字符数组)

s1 = '' % 生成一个空字符串s2 = 'M's3 = 'MathWorks's4 = 'Accelerating the pace of engineering and science's5 = 'You''re right!'s6 = ' 矩阵实验室 '

必须将待建字符串放在单引号对中;每个字符占一个元素位,两个字节;当字符串中本身包含单引号时,每个单引号符用连续的两个

单引号表示;

注意:必须在英文状态下输入“单引号对”。

一、创建字符数组

Page 3: 字符数组 Character Array

2 、函数 char() :使用内部编码创建字符串

s = char(x) 用字符的内部编码 x 创建相应的字符数组 s, x为非负整数数组,实际的字符显示和给定的字符编码有关。 x 的范围为从 0到 65535 ,任何在此范围外的数据都没有定义。

字符编码的前 128 个编码即为 ASCII 码编码 128到 65535 对应的字符取决于系统的区域设置

s1 = char() % 生成空字符串

s2 = char(97)

s3 = char(97:122)

s4 = char([97:122;65:90])

x = 19968:19983

s = char(X)

Page 4: 字符数组 Character Array

   Unicode 目前普遍采用的是 UCS-2 ,它用两个字节来编码一个字符,两个字节就是 16 位二进制, 2的 16 次方等于65536 ,所以 UCS-2 最多能编码 65536 个字符。  字符编码一般用十六进制来表示,为了与十进制区分,十六进制以 0x 开头。  编码从 0到 127 的字符与 ASCII 编码的字符一样,比如字母 "a"的 Unicode    编码是 0x0061 ,十进制是 97 ,而 "a"的ASCII 编码是 0x61 ,十进制也是 97 ,   对于汉字的编码,事实上 Unicode 对汉字支持不怎么好,这也是没办法的,简体和繁体总共有六七万个汉字,而 UCS-2最多能表示 65536 个,才六万 多个,所以 Unicode 只能排除一些几乎不用的汉字,好在常用的简体汉字也不过七千多个,为了能表示所有汉字, Unicode 也有 UCS-4 规范,就是用 4 个字节来编码字符,不过现在普遍采用的还是 UCS-2 ,只用两个字节来编码。

 Unicode 编码

Page 5: 字符数组 Character Array

000 001 010 011 100 101 110 111 0000 NUL DLE SP 0 @ P 、 p 0001 SOH DC1 ! 1 A Q a q 0010 STX DC2 “ 2 B R b r 0011 ETX DC3 # 3 C S c s 0100 EOT DC4 $ 4 D T d t 0101 ENQ NAK % 5 E U e u 0110 ACK SYN & 6 F V f v 0111 BEL ETB ‘ 7 G W g w 1000 BS CAN ( 8 H X h x 1001 HT EM ) 9 I Y i y 1010 LF SUB * : J Z j z 1011 VT ESC + ; K [ k { 1100 FF FS , < L \ l | 1101 CR GS - = M ] m } 1110 SO RS . > N ̂ n ~ 1111 SI US / ? O _ o DEL

附: ASCII 码表 (7 位 )高三位 b6b5b4

低四位b3b2b1b0

字符 0 的编码: 48

字符 A 的编码: 65

字符 a 的编码: 97

Page 6: 字符数组 Character Array

附: Unicode 汉字编码表

Page 7: 字符数组 Character Array

获取字符数组的内部编码

x =double(s) 或 x = abs(s) 把字符数组 s 转换为对应的内部编码数值数组 x 。可以对内部编码数值数组 x 进行数值数组的各种运算。但其结果就变成一般数值向量的运算,而不再是字符串的运算,可使用 char( ) 函数把运算结果转化为对应字符串。

str1 = 'matlab'x = double(str1) - 32str2 = char(x)

Page 8: 字符数组 Character Array

miwen = 'Rfyqfg%2%Ymj%Qfslzflj%Tk%Yjhmsnhfq%Htruzynsl'

恺撒密码

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,它的基本思想是:通过把字母移动一定的位数来实现加密和解密。例如,如果密匙是把明文字母的位数向后移动三位,那么明文字母 B 就变成了密文的 E, 依次类推,X 将变成 A, Y 变成 B, Z 变成 C ,由此可见,位数就是凯撒密码加密和解密的密钥。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

练习:上面的密文是将明文的每个字符(包括字母、空格、符号)按 acsii 码表后移 5 位得到的,请破译这段密文。

Page 9: 字符数组 Character Array

3 、用 [ ] 和 , 串接字符串(一维字符数组)

利用方括号 [ ] ,可将多个字符串变量用逗号“ , ”连接,构成一个长的单行字符串。

t1 = '';t2 = 'MATLAB - ';t3 = 'The Language Of Technical Computing';t4 = '科学计算语言 ';s1 = [t1, t2, t3]s2 = [t2, t3]s3 = [t1, t2, t4]s4 = [t2, t1, t4]

Page 10: 字符数组 Character Array

4 、用 [ ] 和 ; 创建多行(二维)字符数组

t1 = 'Hello,' ;t2 = 'Nice to meet you!';s=[t1; t2]

??? Error using ==> vertcatCAT arguments dimensions are not consistent.

利用方括号 [ ] ,可将多个字符串变量用分号“ ; ” 连接,构成一个多行字符串(二维字符数组),但是必须保证各行等长(每行的字符数目相等)。空字符串会被忽略掉。

解决办法:必须保证各行等长,可在较短字符串的末尾增加适当数量的 “空格” 。

错误原因:t1 6 个字符t2 17 个字符

Page 11: 字符数组 Character Array

t1 = 'Hello,' ;t2 = blanks(11);t4 = 'Nice to meet you!';s1 = [t1, t2; t4]

(1) blanks(n) :创建包含 n 个空格的字符串 s

s1 =

Nice to meet you!Hello,

5 、创建字符数组的一些常用函数

Page 12: 字符数组 Character Array

s1 =

Hello, Nice to meet you!

s2 =

Hello, Nice to meet you!

(2) S = strvcat (t1, t2, t3, ...)   把字符数组 t1,t2,t3,... 作为行,空字符串会被忽略掉,生成二维字符数组 S ,不必考虑每行的字符数是否相等, S 的行数等于 t1,t2,... 的行数之和, S 的列数等于最长的字符串的字符数目,较短字符串的末尾用空格补齐。

t1 = 'Hello,' ;t2 = '';t3 = 'Nice to meet you!';s1 = strvcat(t1, t3)s2 = strvcat(t1, t2, t3)

Page 13: 字符数组 Character Array

(3) t = strcat(s1, s2, s3, ...)   将字符数组 s1, s2, s3 的对应行级联 ( 在水平方向上 ) 。所有输入数组必须具有相同的行数。输入字符数组中尾部的空格被忽略,不出现在输出中。

a = 'hello 'b = 'goodbye'c = strcat(a, b)

c =

hellogoodbye

s1 = strvcat('MathWorks - ','Matlab - ')

s2 = ' Accelerating the pace of engineering and science'

s3 = ' The Language Of Technical Computing'

s4 = strvcat(s2,s3)

s5 = strcat(s1,s4)

Page 14: 字符数组 Character Array

t1 = 'Hello,' ;t2 = '';t3 = 'Nice to meet you!';s1 = char(t1, t3)s2 = char(t1, t2, t3)

s1 =

Hello, Nice to meet you!

s2 =

Hello,

Nice to meet you!

(4) S = char(t1, t2, t3, ...)   把字符数组 t1,t2,t3,... 作为行 ,空字符串不会被忽略,生成二维字符数组 S ,不必考虑每行的字符数是否相等, S 的行数等于 t1,t2,... 的行数之和, S 的列数等于最长的字符串的字符数目,较短字符串的末尾用空格补齐。

Page 15: 字符数组 Character Array

t1 = 'Hello,' ;t2 = '';t3 = 'Nice to meet you!';s1 = str2mat(t1, t3)s2 = str2mat(t1, t2, t3)

s1 =

Hello, Nice to meet you!

s2 =

Hello,

Nice to meet you!

(5) S = str2mat (t1, t2, t3, ...)   把字符数组 t1,t2,t3,... 作为行,空字符串不会被忽略,生成二维字符数组 S ,不必考虑每行的字符数是否相等, S 的行数等于 t1,t2,... 的行数之和, S 的列数等于最长的字符串的字符数目,较短字符串的末尾用空格补齐。

str2mat(t1,t2,...) 的功能与char(t1,t2,...) 一样, matlab 在帮助中说明:This routine will become obsolete( 已不用的 ; 已废弃的 ; 过时的 ) in a future version. Use char instead

Page 16: 字符数组 Character Array

1、 plot(x,y,LineSpec)

用字符数组 LineSpec 指定线型,点标记和画线的颜色

线型 点标记 颜色- 实线: 点线-. 点划线-- 虚线

. 点o 小圆圈x 叉号+ 加号• 星号s 方格d 菱形

v 下三角^ 上三角< 左三角> 右三角p 五角星h 六角星

b 蓝色g 绿色r 红色c 青色

m 棕色y 黄色k 黑色w 白色

LineSpec 的三种属性可以全部指定,也可以只指定其中某一个或两个,排列顺序任意。

二、字符数组在绘图中的简单应用

Page 17: 字符数组 Character Array

x = 0:0.2:2*piy = sin(x)plot(x,y,'r-o')

x = 0:0.2:2*piy = sin(x)plot(x,y,'ro')

指定不指定线型的话, plot( ) 只绘制点标记

Page 18: 字符数组 Character Array

2、 plot(x,y,LineSpec,‘PropertyName’,PropertyValue) 对 plot 生成的图形对象,用指定的 properties 进行设置。用字符数组‘ PropertyName’指定具体的属性

Color 非标准颜色可用 [r,g,b]指定, r,g,b取 0和 1之间的数值LineWidth 线宽LineStyle 线型Marker 点标记MarkerEdgeColor marker 的颜色 ( 或 filled markers 边的颜色)MarkerFaceColor the face of filled markers 的颜色MarkerSize 点标记的大小

PropertyName

filled markers circle, square, diamond, pentagram, hexagram, and the four triangles)

Page 19: 字符数组 Character Array

x = -pi:pi/10:pi;y = tan(sin(x)) - sin(tan(x));plot(x,y,'--rs','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',10)

Page 20: 字符数组 Character Array

3 、 title(’text’)

添加图形标题

例:

Page 21: 字符数组 Character Array

xlabel(’text’) 添加 X 坐标轴标注ylabel(’text’) 添加 Y 坐标轴标注zlabel(’text’) 添加 Z 坐标轴标注

例:

4 、 xlabel( ) / ylabel( ) / zlabel( )

Page 22: 字符数组 Character Array

5 、 legend(string1,string2, ...)

在图形中添加图例

x = 0:0.05: 7y1 = log10(x)y2 = sin(x)plot(x,y1,'b',x,y2,'r')axis([0,7,-2,2])legend('Log(x)','Sin(x)')

Page 23: 字符数组 Character Array

6 、 text( )

在图形中指定位置添加文本

text(x,y,string) 在点 (x,y) 处添加文本text(x,y,string,'PropertyName',PropertyValue...)

x = 0:0.05: 7y = log10(x)plot(x,y)s = '\leftarrow Log(x)'text(2, 0.2, s, 'fontsize',20)

Page 24: 字符数组 Character Array

7 、使用 TeX / LaTeX 在图形中添加希腊字母、数学符号及公式

在Matlab的 text 对象的函数中(函数 title、 xlabel、 ylabel、 zlabel、 text、 legend ),说明文字除使用标准的 ASCII 字符外,还可使用 TeX / LaTeX 格式的控制字符,这样就可以在图形中添加希腊字母、数学符号及公式等内容。 Matlab 支持两个层次的 TeX ,通过 text 的 Interpreter 属性来设置 :

‘tex’ — 默认设置,支持 TeX 的一个子集‘latex’ — 支持 LaTeX‘none’ — 不支持TeX是 D.E.Knuth 开发的免费的功能强大的排版系统,

是公认的数学公式排得最好的系统。

LaTeX 是由 L.Lamport 编写的一个目前最流行的 TeX宏包(宏集、扩展),特别适合数学类论文、书籍的排版,也可以排版普通的文章和书籍。

Page 25: 字符数组 Character Array

\alpha α \upsilon υ \sim ~

\angle ∠ \phi Φ \leq ≤

\ast * \chi χ \infty ∞

\beta β \psi ψ \clubsuit ♣

\gamma γ \omega ω \diamondsuit ♦

\delta δ \Gamma Γ \heartsuit ♥

\epsilon ɛ \Delta Δ \spadesuit ♠

\zeta ζ \Theta Θ \leftrightarrow ↔

\eta η \Lambda Λ \leftarrow ←

\theta Θ \Xi Ξ \Leftarrow ⇐

\vartheta ϑ \Pi Π \uparrow ↑

\iota ι \Sigma Σ \rightarrow →

\kappa κ \Upsilon ϒ \Rightarrow ⇒

\lambda λ \Phi Φ \downarrow ↓

\mu µ \Psi Ψ \circ º

\nu ν \Omega Ω \pm ±

\xi ξ \forall ∀ \geq ≥

\pi π \exists ∃ \propto ∝

\rho ρ \ni ∍ \partial ∂

\sigma σ \cong ≅ \bullet •

\varsigma ς \approx ≈ \div ÷

\tau τ \Re ℜ \neq ≠

\equiv ≡ \oplus ⊕ \aleph ℵ

\Im ℑ \cup ∪ \wp ℘

\otimes ⊗ \subseteq ⊆ \oslash ∅

\cap ∩ \in ∈ \supseteq ⊇

\supset ⊃ \lceil ⌈ \subset ⊂

\int ∫ \cdot · \o ο

\rfloor ⌋ \neg ¬ \nabla ∇

\lfloor ⌊ \times x \ldots ...

\perp ⊥ \surd √ \prime ´

\wedge ∧ \varpi ϖ \0 ∅

\rceil ⌉ \rangle 〉 \mid |

\vee ∨     \copyright ©

\langle 〈    

( 1 ) TeX Character Sequence

Page 26: 字符数组 Character Array

\bf :设置字体为粗体字。

\it :设置字体为斜体字。

\sl :设置字体为斜体字,很少使用。

\rm :设置字体为正常字体。

\fontname{ 字体名 } :设置字体名。例如: \fontname{宋体 }

\fontsize{ 字体大小 } :设置字体大小。例如: \fontsize{16}

_{ 下标 } 表示下标,若下标只有一个字符,可省略 { }

^{ 上标 } 表示上标,若上标只有一个字符,可省略 { }

( 2 ) Tex 字符的字体设置

Page 27: 字符数组 Character Array

例:使用 TeX 输入数学表达式

title('{\itAe}^{-\alpha\itt}sin\beta{\itt} \alpha<<\beta') xlabel('Time \musec.')ylabel('Amplitude')

Page 28: 字符数组 Character Array

\color{颜色名 }颜色名颜色名有 12 种,分别为

red、 green、 yellow、magenta、 blue、 black、 white、cyan、 gray、 barkGreen、 orange和 lightBlue 。

例如: \color{magenta}magenta

\color[rgb]{a b c}设置字体颜色为 RGB 矩阵 [a b c] 所表示的颜

色。 a、 b和 c 都在 [0 1]  范围内。例如: color[rgb]{0 .5 .5}

( 3 ) Tex 字符的颜色设置

Page 29: 字符数组 Character Array

str = '黑 {\color{red}红 \color{green}绿 \color[rgb]{0 0 1}蓝 }黑 'text(0.1,0.5,str,'fontsize',24,'fontname','黑体 ')

例:使用 TeX 指定字符颜色

Page 30: 字符数组 Character Array

\( LaTeX 命令 \)

$ LaTeX 命令 $

$$ LaTeX 命令 $$

在matlab 中,使用 Latex 命令可用下面的方法:

s1 = '$y_1=e^xsin(x)$'s2 = '$$y_2=\frac{1}{2}\sqrt[3]{x}$$'str = char(s1,s2)text(0.2, 0.5, str, 'Interpreter', 'latex', 'FontSize',16)

( 4 )使用 Latex

legend( ) 函数必须先获得句柄,才可以设置 Interpreter属性

h = legend(str1, str2, … )

set(h,'interprete','latex')

Page 31: 字符数组 Character Array

上标用 ^{ 上标 } ,下标用 _{ 下标 } ,希腊字母与 TeX 一样,用 \alpha 等表示

分式 $$\frac{ 分子 }{ 分母 }$$

根式 $$\sqrt{x}$$ 、 $$\sqrt[n]{x}$$

求和 $$\sum_{i=1}^{n} x_{i}$$

积分 $$\int_{0}^{1}$$

偏微分 $$ \frac { \partial{y} } { \partial{x} } $$

极限 $$\lim_{n \rightarrow \infty}$$ %n趋于无穷符号在 lim正下方

$\lim_{n \rightarrow \infty}$ %n趋于无穷符号在 lim右下角

上划线 $$\overline{x}$$

下划线 $$\underline{x}$$ % 下划线在 x 的正下方

卧式花括号命令 $$\overbrace{x+y+z+w}$$

仰式花括号命令 $$a+\underbrace{b+c+d} $$

( 5 )常用 LaTeX 命令

更多的 LaTeX 命令请参考相关的 LaTeX 资料

Page 32: 字符数组 Character Array

1 、字符数组中元素及子数组的访问与赋值

与数值数组一样,可用双下标,也可用单下标访问字符数组中的元素和子数组。

s = strvcat('MathWorks','Matlab')ch1 = s(2,5)ch2 = s(11)s1 = s(:,end:-1:1)s(16) = 'x's(2,9) = 'y's(:,1) = []s(:,end) = 'z'd = s(:)

练习:试写出这些 matlab语句的输出结果,并在 matlab 中进行验证。

三、字符数组的基本操作

Page 33: 字符数组 Character Array

2 、字符数组的关系运算  可以使用关系运算符进行字符数组的比较,但是要求比较的两个数组维数相同,或者其中一个是标量。

>> A = 'fate';>> B = 'cake';>> A == B

ans =

0 1 0 1

>> A > B

ans =

1 0 1 0

Page 34: 字符数组 Character Array

3 、一些通用函数size( ) 获得字符数组的大小(行数、列数)length( ) 获得字符数组的长度(行数、列数中的较大值) numel( ) 获得字符数组的字符总数(总数 = 行数 ×列数) disp( ) 在 command windows 中显示字符数组的内容sort( ) 按照字符的内部编码值对字符串排序

s = strvcat('MathWorks','Matlab');len = length(s)[r,c]=size(s)n = numel(s)disp(s)s1 = sort(s)s2 = sort(s,2)s2 = sort(s,'descend')s2 = sort(s,2,'descend')

练习:试写出这些 matlab语句的输出结果,并在 matlab 中进行验证。

Page 35: 字符数组 Character Array

S.' 或 S' 对字符数组 S 进行转置操作reshape(S,m,n ) 总元素数目不变,改变字符数组的行、列repmat(S,m,n ) 按指定行、列平铺字符数组rot90(S,k) 逆时针旋转字符数组fliplr(S) 左右翻转字符数组flipud (S ) 上下翻转字符数组

s = char(65:89) s1 = reshape(s, 5, 5) s2 = s1.' s3 = rot90(s2) s4 = fliplr(s3) s5 = flipud(s4) s6 = repmat(s5,2,2)

练习:试写出这些 matlab语句的输出结果,并在 matlab 中进行验证。

Page 36: 字符数组 Character Array

diag(S,k ) 提取二维字符数组 S 的第 k条对角线元素diag(t,k ) 构成二维字符数组,其第 k条对角线的元素由一维字符数组 t 中的元素构成 ,其余位置元素为字符 char(0)tril(S) 、 triu(S) 提取字符数组的下(上)三角元素,其余位置元素以字符 char(0)替换

x = reshape(65:89, 5, 5)s = char(x)s1 = tril(s)s2 = triu(s)s3 = diag(s,1) s4 = diag(s3) 练习:试写出这些 matlab语句的

输出结果,并在 matlab 中进行验证。

Page 37: 字符数组 Character Array

四、字符串元胞数组Cell Arrays of Strings

  字符串元胞数组叫字符数组而言,其优点是不要求每个字符串的长度相同,给用户的数据输入和整合提供了方便。

1 、使用 { } 创建字符串元胞数组

>> cs1={'China','City','ShangHai'}

cs1 =

'China' 'City' 'ShangHai'

>> cs2={'China';'City';'ShangHai'}

cs2 =

'China' 'City' 'ShangHai'

Page 38: 字符数组 Character Array

2 、 cellstr( ) :将普通字符数组转为字符串元胞数组

>> data = ['Allison Jones';'Development ';' Phoenix '];>> celldata = cellstr(data)celldata = 'Allison Jones' 'Development' ' Phoenix'

cellstr()会删除字符串尾部的空格

char( ) :可将字符串元胞数组转为普通字符数组

>> str = char(celldata)str =

Allison JonesDevelopment Phoenix

char()会在字符串尾部添加空格,使得每个字符串长度相同

Page 39: 字符数组 Character Array

3 、 iscellstr( ) :判断一个数组是否为字符串元胞数组

tf = iscellstr(A)

>> A = ['ab','cd'];>> B = {'ab','cd'};>> iscellstr(A)ans =

0>> iscellstr(B)

ans =

1

Page 40: 字符数组 Character Array

>> cs1 = {‘China’,‘City’,'ShangHai'}

>> c = cs1{2}

>> class(c)

4 、使用花括号 { } 访问字符串元胞数组的元胞,返回元胞数据,返回类型为字符数组

cs1 = 'China' 'City' 'ShangHai'

c =City

使用花括号 { }同时访问元胞数组的多个元胞,会返回一个逗号分隔列表( a Comma-Separated List ),常用于函数的调用参数及返回值。>> cs1{:}

C{:} 与 C{1}, C{2}, C{3}的效果相同。

ans =China

ans =City

ans =ShangHai

ans =char

Page 41: 字符数组 Character Array

0 1 2 3 4 5 6 7 8 9 10-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

例:使用 cell 数组设置绘图特性clc,clear all,shg,clfhold ons = 'osdph^V<>';ps ={'LineWidth',5,'MarkerSize',25,... 'MarkerEdgeColor',[1,0,0],... 'MarkerFaceColor','g'};for k = 1:length(s) plot(k,0,s(k),ps {:});endaxis([0,10,-1,1])

这个 cell 数组 ps 的元素既有字符数组,又有数值数值,不是单纯的字符元胞数据了。

Page 42: 字符数组 Character Array

五、常用字符串函数

1 、字符串检测函数

2 、简单的字符串处理函数

3 、字符串比较函数

4 、字符串替换和查找函数

5 、字符串执行函数 eval( )

6 、字符串和数值之间的转换函数

7 、不同数制之间的转换函数

8 、格式化输入输出

Page 43: 字符数组 Character Array

1 、字符串检测函数

t1 = '1234abcdef't2 = 'Mat 矩阵 't3 = 'Matlab's = char(t1, t2, t3)L1 = ischar(s)L2 = isletter(s)L3 = isspace(s)

tf=ischar(A)判断输入 A 是否为字符数组 ,如果输入数组 A 是字符数组 ,则返回逻辑 1(真 ),否则返回逻辑 0(假 )。

tf=isletter(‘str’)返回逻辑数组 tf,当 str中元素为英文字母时, tf对应的元素为 1 ,否则为 0

tf=isspace(‘str’)返回逻辑数组 tf,当 str中元素为空格、回车、制表、换行符等时, tf对应的元素为 1 ,否则为 0 。

tf=isstrprop(‘str’, ‘category’)

返回逻辑数组 tf ,判断 str 是否为特定的种类(如alpha , digit , lower , upper ,具体参考帮助文件)

Page 44: 字符数组 Character Array

deblank(s) 删除字符串尾部的空格strtrim(s) 删除字符串的开头和尾部的空格,制表,回车符lower(s) 将字符串中的字母转换成小写upper(s) 将字符串中的字母转换成大写

b = blanks(10)t = 'Matlab 2008a's = [b, t ,b, t, b]L = length(s)s1 = deblank(s)L1 = length(s1)s2 = strtrim(s1)L2 = length(s2)s3 = lower(s2)s4 = upper(s3)

练习:试写出这些 matlab语句的输出结果,并在 matlab 中进行验证。

2 、简单的字符串处理函数

Page 45: 字符数组 Character Array

strjust() 调整字符串排列位置

T = strjust(S) 左对齐T = strjust(S, ‘right’) 右对齐T = strjust(S, ‘left’) 左对齐T = strjust(S, ‘center’) 居中

S = [blanks(10), 'a b c d e', blanks(30)]

T4 = strjust(S, 'center')T3 = strjust(S, 'left')T2 = strjust(S, 'right')T1 = strjust(S)

若字符串前部或尾部没有空格,则左对齐、右对齐、居中的效果完全相同。

Page 46: 字符数组 Character Array

TF = strcmp('str1', 'str2' )

比较字符串 str1和 str2 是否完全相等,是,返回逻辑 1(真 ) ,否,返回逻辑 0(假 )

TF = strcmpi('str1', 'str2' )

比较字符串 str1和 str2 是否完全相等,忽略字母大小写

TF = strncmp('str1', 'str2', n )

比较字符串 str1和 str2前 n列字符是否相等,

TF = strncmpi('str1', 'str2' , n )

比较字符串 str1和 str2前 n 个字符是否相等,忽略字母大小写

3 、字符串比较函数

Page 47: 字符数组 Character Array

>> strcmp('Yes' ,'No')

ans =

0

(1) 比较两个字符串

(2) 比较一个字符串和一个字符串元胞数组

>> a = 'upon';>> b = {'Once' 'upon'; 'a' 'time'};>> strcmp(a, b)

ans =

0 1 0 0

Page 48: 字符数组 Character Array

(3) 比较两个字符串元胞数组

>> c = {'Time' 'flies' 'when'; 'you''re' 'having' 'fun.'};>> d = {'Time' 'drags' 'when'; 'you''re' 'anxiously' 'waiting.'};>> strcmp(c, d)

ans =

1 0 1 1 0 0

Page 49: 字符数组 Character Array

str = strrep(str1, str2, str3)

进行字符串替换,区分大小写。把 str1 中所有的子字符串str2用 str3 来替换

4 、字符串替换和查找函数

s1 = 'This is a good example.'; str = strrep(s1, 'good', 'great')

str =

This is a great example.

strrep( ) 字符串替换strfind( ) 查找字符串findstr( ) 查找字符串 strmatch( ) 寻找符合条件的行 strtok( ) 在字符串里找出指定标记之前的子字符串

  这些函数均可用于字符串元胞数组,具体用法请参考matlab帮助文件。

Page 50: 字符数组 Character Array

k = strfind(str, pattern) 在长字符串 str 中查找是否包含有短字符串 pattern 。若包含,返回数组 k ,其元素为 pattern出现在 str 中的位置若不包含,则返回空数组。

s1 = 'Find the starting indices of the pattern string';

s2 = 'in';

k1 = strfind(s1, s2)

k2 = strfind(s2, s1)

k3 = findstr(s1, s2)

k4 = findstr(s2, s1)

k1 = 2 15 19 45

k = findstr(str1,str2)

查找 str1和 str2 中,较短字符串在较长字符串中出现的位置,没有出现返回空数组。结果与 str1、 str2 的顺序无关。

k2 = ? k3 = ? k4 = ?

Page 51: 字符数组 Character Array

x = strmatch(‘str’, STRS) 检查字符数组 STRS 的每一行,若该行是以字符串 str 开始的,就把该行的行号输出至列数组 x 中。x = strmatch(‘str’, STRS, ‘exact’)检查字符数组 STRS 的每一行,若该行与 str完全相同,就把该行的行号输出至列数组 x 中。

t1 = 'max't2 = 'minimax't3 = 'maximum't4 = 'max imum't5 = 'max 就是最大的意思 'S = char(t1,t2,t3,t4,t5)x1 = strmatch(t1,S)x2 = strmatch(t1,S,'exact')

Page 52: 字符数组 Character Array

token = strtok('str', delimiter)[token, remain] = strtok('str', ...)str :字符串 delimiter :指定的分隔符,未指定 delimiter 的话,默认为空格 char(32), 水平制表符 char(9) 和回车 char(13) 。

s = ['aaabcd',char(32),'matlab',char(32),' 矩阵实验室 ']

[t1, r1] = strtok(s)

[t2, r2] = strtok(s,'a')

[t3, r3] = strtok(s,'b')

[t4, r4] = strtok(s,'w')

练习:试写出这些 matlab语句的输出结果,并在 matlab 中进行验证。

从 str 的第一个元素开始,第一个非分隔字符与其之后的第一个分隔符之间的字符串返回至 token ,之后的部分返回至 remain ;若第一个非分隔字符之后没有分隔符,则从第一个非分隔字符直到 str 的最后一个字符都被返回至token, remain则为空串。

Page 53: 字符数组 Character Array

使用 eval( ) 命令“执行”某一字符串,就如同用户在MATLAB的 Command窗口中输入此字符串并执行一样。

5 、字符串执行函数 eval( )

eval(expression) 在matlab 中执行 expression

clcclear alls1 = 'a = 2';s2 = '3*a';eval(s1)b = eval(s2)s3 = ['c = ',s2];eval(s3)whos

Name Size Bytes Class

a 1x1 8 double

b 1x1 8 double

c 1x1 8 double

s1 1x5 10 char

s2 1x3 6 char

s3 1x7 14 char

Page 54: 字符数组 Character Array

[a1, a2, a3, ...] = eval('myfun(b1, b2, b3, ...)') 执行函数 myfun ,输入参数为 b1,b2,... ,输出参数为 a1,a2,...

eval(‘[a1, a2, a3, ...] = myfun(b1, b2, b3, ...)') 也可以执行函数 myfun ,输入为 b1,b2,... ,输出为 a1,a2,...

x = pis = 'y = sin(x)'eval(s)

x = pis = 'sin(x)'y = eval(s)

这种方式的语法检查不是很严格,可能会产生未曾捕获过的错误或不可预期的行为。

不建议使用这种方式

Page 55: 字符数组 Character Array

6 、字符串和数值之间的转换函数

str = int2str(N) 将整数转换为整数格式的字符串。输入参数N 可以是单一的整数、整数向量或整数矩阵。非整型值在转换前都会被四舍五入取整。

x = [2, 3, 5.7, 1/3, 2/3]s = int2str(x)

s =

2 3 6 0 1

函数 说明int2str 将整数转变成为字符串num2str 将数值转变成为字符串mat2str 将矩阵转变成为可被 eval 函数使用的字符串str2double 将字符串转变为双精度类型的数据str2num 将字符串转变为数字

Page 56: 字符数组 Character Array

clcclear allfor n = 1:5 xn=n;end

clcclear allfor n = 1:5 s=['x',int2str(n),'=n;']; eval(s);end

这些语句执行完后, matlab 的工作区中共有几个变量?变量名是什么?变量的值是什么?若换成右边的语句情况如何?

clcclear allx = eye(3);for r = 1:3 for c = 1:3 s = ['x(' , int2str(r) , ',' , int2str(c) , ') = ' , int2str(x(r,c))]; disp(s); endend

这些 matlab语句在屏幕上输出的结果是什么?在matlab 中验证你的想法是否正确。

Page 57: 字符数组 Character Array

str = num2str (A) 对数组 A 中元素取四位精度,并转换为相对应的字符串 str ,末尾多余的 0 将省略 str = num2str(A, precision) 对数组 A 中元素按照指定的精度 precision 取值,并转换为相对应的字符串 str , 末尾多余的 0将省略 。参数 precision指定输出字符 str 的位数。 str = num2str(A, format) 按照指定的格式 format 来转化,具体的 format 可参考 fprintf 函数的帮助中的相关说明。

x = [2, 3, 5.7, 1/3, 2/3]s1 = num2str(x)s2 = num2str(x,4)s3 = num2str(x,'%11.4f')

s1 =2 3 5.7 0.33333 0.66667s2 =2 3 5.7 0.3333 0.6667s3 =2.0000 3.0000 5.7000 0.3333 0.6667

Page 58: 字符数组 Character Array

str = mat2str(A) 将矩阵 A 转化为字符,包含括号 [ ] ,这样可以使用 eval(str) 命令产生原始矩阵 ( 使用 15 位精度 ) 。

str = mat2str(A,n) 使用 n 位精度将矩阵 A 转化为字符

t = magic(3)s = mat2str(t)A = eval(s)

format longt = randn(3)s1 = mat2str(t)s2 = mat2str(t, 4)t1 = eval(s1)t2 = eval(s2)

s =

4 9 2 3 5 7 8 1 6A =[8 1 6;3 5 7;4 9 2]

Page 59: 字符数组 Character Array

X = str2double(‘str’ ) 把字符串 str 转换为双精度数值若 str2double()无法返回有效的双精度数值,则返回 NaN 。输入参数也可以是字符串元胞数组。

a = str2double('123.45e7')b = str2double('123 + 45i')c = str2double('3.14159')d = str2double('2.7i - 3.14')e = str2double('1,200.34')f = str2double('3.4a')g =str2double({'2.71' '3.1415'})

s1 = '12'd1 = double(s1)d2 = str2double(s1)

s2 = ['1', '2'; '3', '4']d3 = str2double(s2)

d1 = ? d2 = ? d3 = ?

字符串 str 内可以包含下列字符: 字符 0到 9 ,逗号(千位分割符号),小数点, 正负号,指数符号 e( 10 的幂) ,虚数单位 i

Page 60: 字符数组 Character Array

X = str2double(C)C为 cell 数组,用大括号 { } 创建,其元素为字符串X 为与 C同维的数值数组,其元素为 C 数组中的每个字符串转换后的双精度数值,若 str2double()无法返回有效的双精度数值,则返回 NaN 。

C1 = {'12', '3.45'; '-5.6e-1', '7+8i'}C2 = {'b12', '3 4'; '5.6', '7'}X1 = str2double(C1)X2 = str2double(C2)

X1 =

-0.5600 7.0000 + 8.0000i 12.0000 3.4500

X2 =

5.6000 7.0000 NaN NaN

Page 61: 字符数组 Character Array

X = str2num(‘str’ ) 把字符串 str 转换为双精度数值(组) ,若 str2num()无法返回有效的数值,则返回空数组 [] 。输入参数不可以是字符串元胞数组,但是可以使二维字符数组

s1 = ['1 2' ; '3 4']s2 = ['1 2m' ; '3 4i']d1 = str2num(s1)d2 = str2num(s2)

d1 = ? d2 = ?

字符串 str 内可以包含如下字符:

* Digits (数字) * A decimal point (小数点) * A leading + or – sign (正号、负号) * A letter e or d preceding a power of 10 scale factor (字母 e或 d ,表示 10 的幂) * A letter i or j indicating a complex or imaginary number(字母 i或 j ,表示虚数单位)

Page 62: 字符数组 Character Array

例:作出函数 y=e-2tsin(3t) 的图形,并标注最大值点

Page 63: 字符数组 Character Array

%清除内存变量% 时间 t 从 0 到 10 每隔 0.01 均匀采样% 对应每一个 t 求 y 值%求最大值 y_max 及其下标 i_max% 生成最大值点的横坐标字符串% 生成最大值点的纵坐标字符串% 三行字符来标识最大值点%图名称字符串%新建一个图形窗%画一条黑色的水平线%保持图形不被清除%蓝色实线画曲线 y(t)%大小为 20 的红色圆点标记最大值点% 在最大值点附近显示注释字符% 显示图名% 显示横坐标名% 显示纵坐标名% 取消图形保持

cleart = 0 : 0.01 : 10;y = exp( -2*t ) .* sin( 3*t );[ y_max, i_max ] = max( y );t_text = [ 't = ', num2str( t(i_max) ) ]; y_text = [ 'y = ', num2str( y_max ) ]; max_text = char( 'Maxium', t_text, y_text ); Title = [ 'y = exp( -2*t ) .* sin( 3*t )' ];Figureplot( t,zeros( size(t) ), 'k' )hold onplot( t, y, 'b' )plot( t(i_max), y_max, 'r.', 'MarkerSize', 20 )text( t(i_max)+0.3, y_max+0.05, max_text )title( Title )xlabel( 't' )ylabel( 'y' )hold off

Page 64: 字符数组 Character Array

2

2

10 1000

121 1771

11, 121

m m m

m m

输出 之间的数 ,满足 、 均为回文数。所谓回文即正向与反向地读都一样,回文数如: 、 等。

满足上述要求的如:

练习:

Page 65: 字符数组 Character Array

7 、不同数制之间的转换函数

函数 说明bin2dec 将二进制整数字符串转变成为十进制整数dec2bin 将十进制整数转变成为二进制整数字符串hex2dec 将十六进制整数字符串转变成为十进制整数dec2hex 将十进制整数转变成为十六进制整数字符串base2dec

将指定数制类型的数字字符串转变成为十进制整数

dec2base

将十进制整数转变成为指定数制类型的数字字符串

hex2num 将十六进制整数字符串转变成为双精度数据num2hex 将双精度数据转变成为十六进制整数字符串

Page 66: 字符数组 Character Array

数制

进位计数制,简称数制,是人们利用符号来计数的方法。二进制、十进制、八进制和十六进制是学习计算机知识应该掌握的数制。

R进制的数,都有以下三个要点 :(1) 基数为 R,即使用 R个数码。(2) 进位规则为逢R进一(3) 第 i个数位上的数码所具有的位权为 Ri 。 数值可用下面的通式表示:

N = an-1Rn-1 + an-2Rn-2 + … + a1R1 + a0R0 + … + amR-m

Page 67: 字符数组 Character Array

b1 = '01010101';d1 = 123;d2 = bin2dec(b1)b2 = dec2bin(d1)

d2 =

85

b2 =

1111011

bin2dec( ) 二进制字符串转换为十进制整数dec2bin( ) 十进制非负整数转换为二进制字符串

Page 68: 字符数组 Character Array

h1 = 'a1';d1 = 1000;d2 = hex2dec(h1)h2 = dec2hex(d1)

d2 =

161

h2 =

3E8

hex2dec( ) 十六进制字符串转换为十进制整数 dec2hex( ) 十进制非负整数转换为十六进制字符串

Page 69: 字符数组 Character Array

d = base2dec('strn', base)把 base 进制字符串 strn 转换为十进制整数 base 为 2和 36之间的整数

str = dec2base(d, base)str = dec2base(d, base, n)把非负十进制整数 d 转换为 base 进制字符串 , d< 2^52若指定 n ,且 n 比实际输出的字符数目大的话,则在输出的字符串前面补“ 0” 字符,若 n 小于输出字符的数目,则 n 不起作用。

s = '111';d2 = base2dec(s,2)d3 = base2dec(s,3)

d2 = 7

d3 = 13

d = 39;s = dec2base(d,2)s = dec2base(d,2,8)

s =100111

s =00100111

Page 70: 字符数组 Character Array

s1 = 'z1';d1 = 12345d2 = base2dec(s1,36)s2 = dec2base(d1,36)

36 进制的基( A和 a 都表示 10 ):

0 1 2 3 4 5 6 7 8 9 A B C …… X Y Z

10 11 12 ……33 34 35

d2 = ?

s2 = ?

为何 base 为 2 和 36 之间的整数?

Page 71: 字符数组 Character Array

d = 0.25;h = num2hex(d)dd = hex2num(h)

00111111

3 f d 0 0 0 0 0 0 0 0 0 0 0 0 0

hex2num( ) 十六进制字符串转换为 IEEE双精度数num2hex( ) 单、双精度数转换为 16 进制字符串

h =

3fd0000000000000

dd =

0.250000000000000

Page 72: 字符数组 Character Array

格式化字符字 符 说 明%c 显示内容为单一的字符%d 有符号的整数%e 科学计数法,使用小写的 e

%E 科学计数法,使用大写的 E

%f 浮点数据%g 不定,在 %e 或者%f之间选择一种形式%G 不定,在 %E 或者%f之间选择一种形式%o 八进制表示%s 字符串%u 无符号整数%x 十六进制表示,使用小写的字符%X 十六进制表示,使用大写的字符

8 、格式化输入输出函数

(1) sscanf(2) fprintf(3) Input

Page 73: 字符数组 Character Array

(1) 格式化输入函数sscanf :读取格式化字符串

A = sscanf(s,format)

>> S1='2.7183 3.1416';>> S2='2.7183e3 3.1416e3';>> S3='0 2 4 8 16 32 64 128';>> A=sscanf(S1,'%f')A = 2.7183 3.1416>> B=sscanf(S2,'%e')B = 1.0e+003 * 2.7183 3.1416

>> C=sscanf(S3,'%d')C = 0 2 4 8 16 32 64 128

Page 74: 字符数组 Character Array

>> S1='0 2 4 8 16 32 64 128';>> A=sscanf(S3,'%d')A = 0 2 4 8 16 32 64 128

>> B=sscanf(S3,'%d',1)B = 0>> C=sscanf(S3,'%d',3)C = 0 2 4

A = sscanf(s,format,size)

Page 75: 字符数组 Character Array

( 2) 格式化输出函数

sprintf :格式化输出数据到命令行窗口S = sprintf(format,A,······)

>> A=1/eps;

>> B=-eps;

>> S1=sprintf('%+15.5f',A)

S1 =

+4503599627370496.00000

>> S2=sprintf('%+.5e',B)

S2 =

-2.22045e-016

格式化字符串中若包含了“ +” ,则表示在输出的字符串中包含数据的符号

Page 76: 字符数组 Character Array

>> C=[65,66,67,pi];

>> D=[pi,65,66,67];

>> S3=sprintf('%s%f',C)

S3 =

ABC3.141593

>> S4=sprintf('%s%f%s',D)

S4 =

3.141593e+00065.000000BC

对于整数数值进行格式化输出时,可以直接将向量转变成为字符串

如果输出的数据与相应的格式化字符串不匹配时,则输出数值最常见的一种形式

Page 77: 字符数组 Character Array

(3) input 函数

   MATLAB提供了 input 函数来完成获取用户输入数据的功能,以满足能够和用户的输入进行交互的需要。

A = input(prompt)

A = input(prompt,’s’)

1.第一个参数 prompt 为提示用的字符串2.第二个参数 s

若有 s ,则输入的数据为字符串没有 s ,则输入的数据为双精度数据

Page 78: 字符数组 Character Array

例: >> A=input('随便输入数字: ') 随便输入数字: 264 A = 264

>> B=input('随便输入数字: ','s') 随便输入数字: 264 B = 264

>> whos Name Size Bytes Class A 1x1 8 double array B 1x3 6 char array Grand total is 4 elements using 14 bytes