习题2
1. 请读者先运行以下指令 a=0;b=pi;
t1=a:pi/9:pi;
t2=linspace(a,b,10); T=t1*t2'; F=find(T<0);
然后,请回答变量a、t1、T、F的维度、规模、长度分别是多少?t1完全等于t2吗?为什么?
1)产生数据 a=0;b=pi;
t1=a:pi/9:pi;
t2=linspace(a,b,10); T=t1*t2';
F=find(T<0);
2)罗列各变量的特征
Na=ndims(a);Nt1=ndims(t1);NT=ndims(T);NF=ndims(F);
Sa=size(a);St1=size(t1);ST=size(T);SF=size(F); La=length(a);Lt1=length(t1);LT=length(T);LF=length(F);
fprintf('数组%7s%8s%8s%8s\\n','a','t1','T','F') fprintf('维度数]???\\n',Na,Nt1,NT,NF) fprintf('规模]=]=]=]=\\n',Sa,St1,ST,SF) fprintf('长度}???\\n',La,Lt1,LT,LF)
数组 a t1 T F 维度数 2 2 2 2 规模 1 1 1 10 1 1 0 0 长度 1 10 1 0
3)判断数组相等
P=t1==t2 %对不同浮点计算方法获得的数进行比较的本指令,不推荐使用 E=max(abs(t1-t2)) P =
1
1 1 1 1 1 1 0 1 1 1 E =
4.4409e-16
可见2个数组中的元素不完全相等。应记住:这种现象在数值计算中常常会遇到;并且,若想检验同一个量的不同方法、途径算得的结果,应尽量不用“==”符判断,而应借助“两个量间的(相对)误差水平是否小于某个容差”进行判断。比如 pp=abs(t1-t2)<1e-14 pp =
1 1 1 1 1 1 1 1 1 1
2. 对于指令A=reshape(1:18,3,6)产生的数组 A =
1 4 7 10 13 16 2 5 8 11 14 17 3 6 9 12 15 18
先请你用一条指令,使A数组中取值为2、4、8、16的元素都被重新赋值为NaN。然后,再请你用一条指令,把A数组的第4、5两列元素都被重新赋值为Inf。
1)产生数组A
A=reshape(1:18,3,6) A =
1 4 7 10 13 16 2 5 8 11 14 17 3 6 9 12 15 18
2)利用单序号实现对2、4、8、16的元素的重新赋值 A([2,4,8,16])=NaN %这些位置元素的重赋值不可能采用“全下标”一次性实现 A =
1 NaN 7 10 13 NaN NaN 5 NaN 11 14 17 3 6 9 12 15 18
3)利用全下标和冒号对第4、5列元素进行重赋值 A(:,[4,5])=Inf A =
1 NaN 7 Inf Inf NaN
2
NaN 5 NaN Inf Inf 17 3 6 9 Inf Inf 18
3. 由指令rng('default'),A=rand(3,5)生成二维数组A,试求该数组中
所有大于0.5的元素的位置,分别求出它们的“全下标”和“单下标”。
1)产生试验数组 rng('default') A=rand(3,5) A =
0.8147 0.9134 0.2785 0.9649 0.9572 0.9058 0.6324 0.5469 0.1576 0.4854 0.1270 0.0975 0.9575 0.9706 0.8003
2)寻找数值大于0.5的所有元素的全下标 [ri,cj]=find(A>0.5); disp(' ')
disp('大于0.5的元素的全下标') disp(['行号 ',int2str(ri')]) disp(['列号 ',int2str(cj')])
大于0.5的元素的全下标
行号 1 2 1 2 2 3 1 3 1 3 列号 1 1 2 2 3 3 4 4 5 5
3)寻找数值大于0.5的所有元素的单序号 id=find(A>0.5); disp(' ')
disp('大于0.5的元素的单序号') disp(id')
大于0.5的元素的单序号
1 2 4 5 8 9 10 12 13 15
4. 已知A=magic(3),B=rand(3),请回答以下问题:
(1)A.*B和B.*A的运行结果相同吗?请说出理由。 (2)A*B和A.*B的运行结果相同吗?请说出理由。
3