习题2-数值数组及向量化运算
- 格式:docx
- 大小:58.10 KB
- 文档页数:7
c语言数组练习题C语言数组练习题C语言作为一门被广泛应用的编程语言,数组是其重要的数据结构之一。
掌握数组的使用和操作对于编写高效的程序至关重要。
本文将通过一些实际的练习题来帮助读者加深对C语言数组的理解和应用。
1. 求数组元素的和题目:给定一个整数数组,编写一个程序来计算数组中所有元素的和。
解法:使用一个变量sum来存储数组元素的和。
通过遍历数组,将每个元素累加到sum中,最后返回sum即可。
以下是示例代码:```c#include <stdio.h>int sumArray(int arr[], int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += arr[i];}return sum;}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);int sum = sumArray(arr, size);printf("数组元素的和为:%d\n", sum);return 0;}```2. 查找数组中的最大元素题目:给定一个整数数组,编写一个程序来找到数组中的最大元素。
解法:使用一个变量max来存储数组中的最大值。
通过遍历数组,将每个元素与max比较,更新max的值为较大的那个元素。
以下是示例代码:```c#include <stdio.h>int findMax(int arr[], int size) {int max = arr[0];for (int i = 1; i < size; i++) {if (arr[i] > max) {max = arr[i];}}return max;}int main() {int arr[] = {3, 8, 2, 1, 5};int size = sizeof(arr) / sizeof(arr[0]);int max = findMax(arr, size);printf("数组中的最大元素为:%d\n", max);return 0;}```3. 数组元素的反转题目:给定一个整数数组,编写一个程序来反转数组中的元素。
第 2 章 数值数组及向量化运算本章集中讲述两个数据类型(数值数组和逻辑数组)、两个特有概念变量(非数和空)、以及MATLAB的数组运算和向量化编程。
值得指出:本章内容是读者今后编写各种科学计算M码的基本构件。
数值数组(Numeric Array)是MATLAB最重要的数据类型数组。
在各种维度的数值数组中,二维数组为最基本、最常用。
本章对二维数组创建、标识、寻访、扩充、收缩等方法进行了详尽细腻的描述,并进而将这些方法推广到高维数组。
本章讲述的逻辑数组主要产生于逻辑运算和关系运算。
它是MATLAB 援引寻访数据、构成数据流控制条件、、编写复杂程序所不可或缺的重要构件。
数组运算是MATLAB区别于其它程序语言的重要特征,是MATLAB绝大多数函数指令、Simulink许多库模块的本性,是向量化编程的基础。
为此,本章专辟第2.2节用于阐述MATLAB的这一重要特征。
在此提醒读者注意:随书光盘mbook目录上保存着本章相应的电子文档“ch02_数值数组及向量化运算.doc”。
该文档中有本章全部算例的可执行指令,以及相应的运算结果。
2.1数值数组的创建和寻访2.1.1一维数组的创建1递增/减型一维数组的创建(1)“冒号”生成法(2)线性(或对数)定点法2其他类型一维数组的创建(1)逐个元素输入法(2)运用MATLAB函数生成法【例2.1-1】一维数组的常用创建方法举例。
a1=1:6a2=0:pi/4:pia3=1:-0.1:0a1 =1 2 3 4 5 6a2 =0 0.7854 1.5708 2.3562 3.1416a3 =Columns 1 through 81.0000 0.9000 0.8000 0.7000 0.6000 0.5000 0.4000 0.3000Columns 9 through 110.2000 0.1000 0b1=linspace(0,pi,4)b2=logspace(0,3,4)b1 =0 1.0472 2.0944 3.1416b2 =1 10 100 1000c1=[2 pi/2 sqrt(3) 3+5i]c1 =2.0000 1.5708 1.73213.0000 + 5.0000i rng defaultc2=rand(1,5)c2 =0.8147 0.9058 0.1270 0.9134 0.6324〖说明〗x1=(1:6)' , x2=linspace(0,pi,4)'y1=rand(5,1)z1=[2; pi/2; sqrt(3); 3+5i]2.1.2二维数组的创建1小规模数组的直接输入法【例2.1-2】在MATLAB环境下,用下面三条指令创建二维数组C。
说明:如在测试时请将程序中的中文字符改为西文(部分程序为手写,并未经matlab验证)2012年春《MATLAB基础》第一次上机练习与作业练习1:脚本文件建立一个文件名为helloWorld的脚本文件,运行该文件时显示出如下文字:Hello World!I am going to learn MATLAB•提示: 用disp显示字符串,将要显示的字符号串用单引号引起来。
如'This is a string'练习2:变量获取并保存当前的日期与时间●用函数clock生成一个变量,变量名为start●用size查看start的维数,它是一个行向量还是一个列向量?●start包含什么内容?用help clock查看●用函数datestr将向量start转换成字符串,得到新的变量,名为startString●将start与startString保存为mat文件,文件名为startTime●在练习1建立的脚本文件helloWorld.m文件中,用load函数导入变量startTime, 并显示如下文字:I started learning MATLAB on * start date and time*练习3:标量你将要以指数增长的速度来学习MATLAB, 将如下内容添加到helloWorld.m文件中●假设你的学习时间是一个常量,为1.5 days,将此时间用秒表示,赋给变量tau●假设课程持续时间为5 days. 将这个时间单位转换为秒,保存在变量endofClass中?●将学到的知识描述为t的函数,函数方程为:●用函数datestr将向量start转换成字符串,得到新的变量startString●在课程结束时间endofClass,你将学到多少知识?用变量knowledgeAtEnd表示(指数函数exp)●用变量knowledgeAtEnd,显示如下语句:At the end of the MATLAB class, I will know X% of MATLAB提示: 将数转换成字符串,用num2str练习4:向量运算计算从课程开始到现在经过的时间,用秒表示.●在helloWorld.m中,建立一系列变量,变量名分别为:secPerMin, secPerHour,secPerDay,secPerMonth(假设每个月30.5天),以及secPerYear.●将变量按次序secPerYear,secPerMonth, secPerDay,secPerHour, secPerMin,1 排列,构成一个行向量,命名为secConversion?●用时钟函数clock生成一个向量currentTime●计算经过的时间elapsedTime,用currentTime与start相减.●通过向量secondConversion与elapsedTime的数量积运算计算时间t,●显示当前的时间水平,用变量currentKnowledge表示. ()●显示如下语句:At this time, I know X% of MATLAB练习5:向量函数计算你的学习轨迹.●在helloWorld.m中,建立线性时间向量tVec,包含从0到endOfClass的10000个样本点.●计算在每个时间点处对应的知识值,仍然用函数练习6:向量寻址什么时候你将学到50%的MATLAB知识?.●在向量knowledgeVec中,查找最接近0.5的元素所在的位置.●用halfTime保存对应的时间●显示如下语句:I will know half of MATLAB after X days要将halfTime用secPerDay转换成天数练习7:绘图画出学习的轨迹图?.●在helloWorld.m中,打开一个新的图形窗口(figure)●用向量tVec与knowledgeVec画出知识轨迹,画图时,将时间单位转换为天●用图形窗口中的zoom in 查看halfTime,与前面计算结果相比较.clear,clc;disp('Hello World!');disp('I am going to learn MA TLAB');start=clock;[startx,starty]=size(start);if startx>startydisp('一个行向量')elsedisp('一个列向量');endstartString=datestr(start);save startTime.mat start startString;waittime=input('为使程序达到较好的执行效果,请输入程序需要暂停时间(秒):'); state = 0;h = waitbar(0, '请等待...', 'Name', '进度条', 'CreateCancelBtn', ...'state = 1; delete(h); clear h');h1 = findall(h, 'style', 'pushbutton');set(h1, 'string', '取消', 'fontsize', 10)for i = 1 : 100waitbar(i/100, h, ['已暂停时间百分比' num2str(i) '%']);pause(waittime/100);if statebreakendendif exist('h') == 1delete(h);endload startTimedisp('I started learning MATLAB on * start date and time*');tau=1.5*24*3600;endofClass=5*24*3600;knowledgeAtEnd=1-exp(-tau/endofClass);disp(['At the end of the MATLAB class, I will know ',num2str(knowledgeAtEnd*100),' % of MATLAB']);secPerMin=60;secPerHour=3600;secPerDay=24*secPerHour;secPerMonth=30.5*secPerDay;secPerYear=12*secPerMonth;secondConversion=[secPerYear,secPerMonth, secPerDay,secPerHour, secPerMin,1]; currentTime=clock;elapsedTime=currentTime-start;elapsedTime=elapsedTime.*secondConversion;currentknowledge=1-exp(-elapsedTime/endofClass);disp(['At this time, I know ',num2str(sum(currentknowledge)*100),'% of MATLAB']);tVec=linspace(0,endofClass,1000);knowledgeVec=1-exp(-tVec./endofClass);halfTimeindex=find(abs(knowledgeVec-0.5)<1e-3);halfTime=sum(tVec(halfTimeindex))/length(halfTimeindex)/secPerDay;disp(['I will know half of MATLAB after ',num2str(halfTime),' days']);plot(tVec/secPerDay,knowledgeVec);xlabel('Day');2012年春《MATLAB基础》第二次上机练习与作业练习1:函数文件建立一个文件名为plotSin的函数文件,要求:●函数声明为:functon plotSin(f1)●该函数用于画出频率为的正弦波在区间上的图像.●每个周期含有16个数据点function plotsin(f1)xnum=16*f1;x=linspace(0,2*pi,xnum);plot(x,sin(f1*x));练习2:条件语句●修改函数plotSin(f1)使之有两个输入变量,形式为plotSin(f1,f2)●如果输入的变量个数为1,执行以前写的绘图命令.否则显示文字'Two inputs were given'●提示:输入变量的数目用内置变量名:narginfunction plotsin(f1,f2)if nargin==1xnum=16*f1;x=linspace(0,2*pi,xnum);plot(x,sin(f1*x));elseerror('Two inputs were given');end练习3:绘图命令●修改PlotSin中的绘图命令,将数据点类型改为正方形,线形改为红色虚线,线宽为2.设置数据点填充色为黑色(属性名为:LineWidth, MarkerFaceColor)●如果有2个输入变量,新开一个绘图窗口,上下排列,并且激活上面图形窗口plotSin(6)plotSin(2,3)function plotsin(f1,f2)if nargin==1h1=figure(1);xnum=16*f1;x=linspace(0,2*pi,xnum);plot(x,sin(f1*x),'--rs','MarkerFaceColor','k','LineWidth',2);elseh2=figure(2);h1=figure(1);xnum=16*f1;x=linspace(0,2*pi,xnum);plot(x,sin(f1*x),'--rs','MarkerFaceColor','k','LineWidth',2);end练习4:半对数图在过去5年里,某课程学生人数分别为:15,25,55,115,144.班级规模似乎呈指数增长趋势,用半对数图来验证.要求绘制的图形效果如下●相关函数:semilogy,xlabel,ylabel,axis,title●数据点为玫红,正方形,没有折线相连.点的大小为10,点边线的宽度为4.x=1:5;y=[15,25,55,115,144];h=semilogy(x,y,' sr','MarkerSize',10,'Linewidth',4);xlabel('x');ylabel('y');title('My Semilogy plot');axis([0,6,10,300])set(h,'Color',[1 0.3 0.6]);练习5:条形图生成一个有5个随机数构成的向量,画出一幅条形图,条形块为红色.效果如下:bar(1:5,rand(5,1),'r')练习6:圆的绘制●建立一个画圆的函数文件.function [x y]=getCircle(center,r)运行程序得到的是圆上点的坐标●调用程序画出同心圆及五环图,效果如下col=['b','k','r','y','g'];subplot 121r1=1:5;center1=[0,0];for i=1:5[x,y]=getCircle(center1,r1(i));plot(x,y,col(i),'Linewidth',2);hold onendaxis equalaxis([-5 5 -5 5])subplot 122r2=0.5;center2=[-1 0;0 0;1 0;-0.5 -0.5;0.5 -0.5];for i=1:5[x,y]=getCircle(center2(i,:),r2);plot(x,y,col(i),'Linewidth',2);hold onendaxis equalaxis([-1.5 1.5 -1.5 1])-505-101-1.5-1-0.50.512012年春《MATLAB 基础》第三次上机练习与作业练习1:演示文件命令窗口中,键入:demo,出现MATLAB的demo演示窗口,然后选择:MATLAB下的Matrices,依次选取其中的Basic Matrix operation 、Matrix manipulation两个示例,进行MATLAB矩阵运算的学习。
C程序设计(数组)习题与答案C程序设计(数组)习题与答案数组是C语言中常用的数据结构之一,它可以存储多个相同类型的元素。
掌握数组的使用对于C程序设计至关重要,下面将为大家介绍一些关于C数组的习题及其答案。
1. 习题一:计算数组元素的和题目描述:编写一个程序,计算给定数组中所有元素的和,并输出结果。
解题思路:```c#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5}; // 定义一个包含5个元素的整型数组int sum = 0; // 用于存储和的变量// 遍历数组,累加每个元素的值for (int i = 0; i < 5; i++) {sum += arr[i];}printf("数组元素的和为:%d\n", sum);return 0;}```2. 习题二:查找数组中的最大值题目描述:编写一个程序,找出给定整型数组中的最大值,并输出结果。
解题思路:```c#include <stdio.h>int main() {int arr[7] = {4, 7, 2, 9, 1, 5, 8}; // 定义一个包含7个元素的整型数组int max = arr[0]; // 假设第一个元素为最大值// 遍历数组,比较每个元素的值与当前最大值的关系for (int i = 1; i < 7; i++) {if (arr[i] > max) {max = arr[i];}}printf("数组中的最大值为:%d\n", max);return 0;}```3. 习题三:查找数组中的特定元素题目描述:编写一个程序,在给定整型数组中查找是否存在指定元素,并输出结果。
解题思路:```c#include <stdio.h>int main() {int arr[6] = {3, 6, 9, 2, 5, 8}; // 定义一个包含6个元素的整型数组 int target = 2; // 指定要查找的元素int found = 0; // 用于标记是否找到目标元素的变量// 遍历数组,比较每个元素的值与目标值的关系for (int i = 0; i < 6; i++) {if (arr[i] == target) {found = 1;break;}}if (found) {printf("数组中存在目标元素:%d\n", target);} else {printf("数组中不存在目标元素:%d\n", target);}return 0;}```4. 习题四:数组元素逆序排列题目描述:编写一个程序,将给定整型数组的元素逆序排列,并输出结果。
向量化运算
向量化运算是指将数学运算应用于整个向量或矩阵,以提高计算效率和简化代码。
向量化运算可以利用硬件优化,如使用SIMD指令集或并行处理器。
向量化运算可以在很大程度上提高计算速度,特别是在大规模数据或高维度数据上。
传统的循环运算可能会导致大量的重复计算和内存访问,而向量化运算可以同时对整个向量或矩阵进行操作,减少了循环和内存操作的开销。
常见的向量化运算包括加法、减法、乘法、除法、点积、叉积等运算。
通过对整个向量或矩阵进行这些运算,可以大幅提高计算效率。
在Python中,NumPy是一个常用的向量化运算库。
它提供了多维数组对象和一组函数,可以进行高效的向量化运算。
使用NumPy,可以方便地对大规模数据进行数学运算,并且可以利用底层的C语言优化,提高运算速度。
例如,可以使用NumPy进行矩阵乘法操作:
```python
import numpy as np
a = np.array([[1, 2], [3, 4]]) # 创建矩阵
b = np.array([[5, 6], [7, 8]])
c = a.dot(b) # 矩阵相乘
print(c)
```
输出结果为:
```
[[19 22]
[43 50]]
```
以上代码中,a和b都是二维数组,使用dot()函数进行矩阵乘法运算,得到结果c。
通过向量化运算,可以高效地进行矩阵乘法操作。
姓名:马凯邮箱:matlab2011@ QQ : 9068005数组是MTALAB进行计算和处理的核心内容之一,出于快速运算的需要,MATLAB 总把数组看作存储和运算的基本单元,标量数据也被看作是1×1的数组。
因此,数组的创建、寻址和操作就显得非常重要。
MATLAB 提供了各种数组创建的方法和操作方法,使得MATLAB的数值计算和操作更加灵活和方便。
数组的创建和操作是MATLAB运算和操作的基础.数组的创建一、一维数组的创建直接输入法步长生成法: x=a:inc:b等间距线形成生法:x=linspace(a,b,n)注意x=linspace(a,b,n) 等价于)(:-=-/(nb x:)1aba对数等间距生成法x=logspace(a,b,n)LOGSPACE(X1,X2)generates a row vector of50logarithmically equally spaced points between decades10^X1and10^X2.If X2is pi,then the points are between 10^X1and pi.LOGSPACE(X1,X2,N)generates N points.For N<2,LOGSPACE returns10^X2.例1 一维数组的创建举例A1=[0.2,pi/2,‐4,7,sin(5)]A2=0:0.5:3A3=linspace(1,6,7)A4=logspace(1,6,7)A5=logspace(0,3,4)rand('twister',0)% rng default 效果一样c2=rand(1,5)c2 =0.5488 0.7152 0.6028 0.5449 0.4237例2 一维列数组的创建举例x1=(1:6)‘X2=linspace(0,pi,4)‘y1=rand(5,1)z1 =[0.2;pi/2;‐4;7;sin(5)]二、二维数组(即矩阵)的创建直接输入二维数组的元素来创建中规模数组的数组编辑器创建法当数组规模较大,元素数据比较冗长时,借助数组编辑器比较方便。
习题21.请读者先运行以下指令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('维度数%5d%8d%8d%8d\n',Na,Nt1,NT,NF)fprintf('规模%5d%3d%5d%3d%5d%3d%5d%3d\n',Sa,St1,ST,SF)fprintf('长度%7d%8d%8d%8d\n',La,Lt1,LT,LF)数组 a t1 T F维度数 2 2 2 2规模 1 1 1 10 1 1 0 0长度 1 10 1 03)判断数组相等P=t1==t2 %对不同浮点计算方法获得的数进行比较的本指令,不推荐使用E=max(abs(t1-t2))P =1 1 1 1 1 1 0 1 11E =可见2个数组中的元素不完全相等。
应记住:这种现象在数值计算中常常会遇到;并且,若想检验同一个量的不同方法、途径算得的结果,应尽量不用“==”符判断,而应借助“两个量间的(相对)误差水平是否小于某个容差”进行判断。
数组期末练习题数组是程序设计中常用的数据结构之一,它能够存储一组相同类型的数据,并通过索引来访问每个元素。
本期练习题将帮助我们巩固对数组的理解,并通过实际的编程练习提升我们的技能水平。
以下是一些题目和解答,希望对您有所帮助。
题目一:计算数组元素之和输入一个包含整数的数组,计算数组中所有元素的和并输出结果。
解答:```c++#include <iostream>using namespace std;int main() {int arr[] = {1, 2, 3, 4, 5};int sum = 0;for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {sum += arr[i];}cout << "数组元素之和为:" << sum << endl;return 0;}```题目二:查找数组中的最大值和最小值输入一个包含整数的数组,找出数组中的最大值和最小值并输出结果。
解答:```c++#include <iostream>using namespace std;int main() {int arr[] = {3, 2, 5, 1, 4};int maxVal = arr[0];int minVal = arr[0];for(int i = 1; i < sizeof(arr)/sizeof(arr[0]); i++) {if(arr[i] > maxVal) {maxVal = arr[i];}if(arr[i] < minVal) {minVal = arr[i];}}cout << "数组中的最大值为:" << maxVal << endl;cout << "数组中的最小值为:" << minVal << endl;return 0;}```题目三:反转数组输入一个包含整数的数组,将数组中的元素按相反的顺序重新排列,并输出结果。
数据结构与算法的练习题集在学习数据结构与算法的过程中,练习题是巩固知识、提升技能的重要手段。
接下来,为大家整理了一系列具有代表性的练习题,涵盖了常见的数据结构和算法类型。
一、数组相关练习题1、给定一个整数数组,找出其中最大的连续子数组和。
例如,对于数组`-2, 1, -3, 4, -1, 2, 1, -5, 4 `,最大连续子数组和为 6 ,对应的子数组是` 4, -1, 2, 1 `。
2、旋转数组。
给定一个整数数组`nums` ,将数组中的元素向右移动`k` 个位置,其中`k` 是非负数。
比如,对于数组` 1, 2, 3, 4, 5, 6, 7 `,如果`k = 3` ,则旋转后的数组为` 5, 6, 7, 1, 2, 3, 4 `。
二、链表相关练习题1、反转链表。
给定一个单链表,将其反转。
例如,对于链表`1 > 2 > 3 > 4 > 5` ,反转后为`5 > 4 > 3 >2 > 1` 。
2、合并两个有序链表。
给定两个有序链表`l1` 和`l2` ,将它们合并成一个新的有序链表。
三、栈和队列相关练习题1、用两个栈实现队列。
实现一个队列,使用两个栈来完成入队和出队操作。
2、有效的括号。
给定一个只包含`'('`、`')'`、`'{'`、`'}'`、`''`、`''`的字符串,判断括号是否有效。
四、树相关练习题1、二叉树的前序遍历、中序遍历和后序遍历。
给定一个二叉树,分别实现前序遍历、中序遍历和后序遍历的算法。
2、二叉搜索树的查找、插入和删除操作。
五、图相关练习题1、深度优先搜索和广度优先搜索。
对于给定的图,实现深度优先搜索和广度优先搜索算法。
2、最短路径问题。
例如,在一个有权图中,找到从一个顶点到其他所有顶点的最短路径。
六、排序算法相关练习题1、冒泡排序、插入排序、选择排序的实现和性能分析。
2、快速排序和归并排序的实现及时间复杂度分析。
3、给定一个乱序的整数数组,使用至少两种排序算法对其进行排序,并比较它们的性能。
习题21.请读者先运行以下指令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=lengt h(F);fprintf('数组%7s%8s%8s%8s\n','a','t1','T','F') fprintf('维度数%5d%8d%8d%8d\n',Na,Nt1,NT,NF)fprintf('规模%5d%3d%5d%3d%5d%3d%5d%3d\n',Sa,St1,ST,SF)fprintf('长度%7d%8d%8d%8d\n',La,Lt1,LT,LF)数组 a t1 T F维度数 2 2 2 2规模 1 1 1 10 1 1 0 0长度 1 10 1 03)判断数组相等P=t1==t2 %对不同浮点计算方法获得的数进行比较的本指令,不推荐使用E=max(abs(t1-t2))P =1 1 1 1 1 1 0 1 1 1E =4.4409e-16可见2个数组中的元素不完全相等。
应记住:这种现象在数值计算中常常会遇到;并且,若想检验同一个量的不同方法、途径算得的结果,应尽量不用“==”符判断,而应借助“两个量间的(相对)误差水平是否小于某个容差”进行判断。
比如pp=abs(t1-t2)<1e-14pp =1 1 1 1 1 1 1 1 1 1 2.对于指令A=reshape(1:18,3,6)产生的数组A =1 4 7 10 13 162 5 8 11 14 173 6 9 12 15 18先请你用一条指令,使A数组中取值为2、4、8、16的元素都被重新赋值为NaN。
然后,再请你用一条指令,把A数组的第4、5两列元素都被重新赋值为Inf。
1)产生数组AA=reshape(1:18,3,6)A =1 4 7 10 13 162 5 8 11 14 173 6 9 12 15 182)利用单序号实现对2、4、8、16的元素的重新赋值A([2,4,8,16])=NaN %这些位置元素的重赋值不可能采用“全下标”一次性实现A =1 NaN 7 10 13 NaNNaN 5 NaN 11 14 173 6 9 12 15 183)利用全下标和冒号对第4、5列元素进行重赋值A(:,[4,5])=InfA =1 NaN 7 Inf Inf NaNNaN 5 NaN Inf Inf 173 6 9 Inf Inf 183.由指令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.95720.9058 0.6324 0.5469 0.1576 0.48540.1270 0.0975 0.9575 0.9706 0.80032)寻找数值大于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 53)寻找数值大于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)A*B 和B*A 的运行结果相同吗?请说出理由。
(4)A.\B 和B./A 的运行结果相同吗?请说出理由。
(5)A\B 和B/A 的运行结果相同吗?请说出理由。
(6)A*A\B-B 和A*(A\B)-B 的运行结果相同吗?它们中那个结果的元素都十分接近于0?(7)A\eye(3)和eye(3)/A 的运行结果相同吗?为什么?(1)相同。
数组对应元素间相乘运算,服从交换律。
(2)不同。
前者是矩阵乘积,后者是数组对应元素的乘积。
(3)不同。
矩阵乘运算不服从交换律。
(4)相同。
因为在两个指令中,数组A 始终是“除数组”,而B 是“被除数组”。
(5)一般不同。
前者是B 左除A ,后者是B 右除A 。
(6)后者结果接近于全0元素阵。
A*(A\B)-B 相当于A*(inv(A)*B)-B ,所以几乎为0阵。
(7)相同。
实际上得到的就是A 的逆阵。
5. 已知矩阵⎥⎦⎤⎢⎣⎡=4321A ,(1)运行指令B1=A.^(0.5), B2=0.5.^A, B3=A^(0.5), B4=0.5^A 可以观察到不同运算方法所得结果不同。
(2)请分别写出根据B1, B2, B3, B4恢复原矩阵A 的M 码。
1)生成四个指数运算结果A=[1,2;3,4];B1=A.^0.5B2=0.5.^A %等式两边进行若进行对数操作,可得B3=A^0.5B4=0.5^A %等式两边进行若进行矩阵对数操作,可得 B1 =1.0000 1.41421.73212.0000B2 =0.5000 0.25000.1250 0.0625B3 =0.5537 + 0.4644i 0.8070 - 0.2124i1.2104 - 0.3186i 1.7641 + 0.1458iB4 =0.9910 -0.4422-0.6634 0.32762)逆运算A1=B1.^2A2=log(B2)/log(0.5)A3=B3^2A4=logm(B4)/logm(0.5)A1 =1.00002.00003.00004.0000A2 =1 23 4A3 =1.0000 + 0.0000i2.0000 + 0.0000i3.0000 - 0.0000i4.0000 + 0.0000iA4 =1.00002.00003.00004.00006.先运行指令x=-3*pi:pi/15:3*pi; y=x; [X,Y]=meshgrid(x,y);warning off; Z=sin(X).*sin(Y)./X./Y; 产生矩阵Z。
(1)请问矩阵Z中有多少个“非数”数据?(2)用指令surf(X,Y,Z); shading interp观察所绘的图形。
(3)请写出绘制相应的“无裂缝”图形的全部指令。
(提示:isnan用于判断是否非数;可借助sum求和;realmin是最小正数。
)〖解答〗x=-3*pi:pi/15:3*pi;y=x;[X,Y]=meshgrid(x,y);warning offZ=sin(X).*sin(Y)./X./Y;NumOfNaN=sum(sum(isnan(Z))) %计算“非数”数目%NumOfNaN2=length(find(isnan(Z)==1))subplot(1,2,1),surf(X,Y,Z),shading interp,title('有缝图')%产生无缝图XX=X+(X==0)*realmin;YY=Y+(Y==0)*realmin;% realmin返回指定浮点数类型所能表示的最小值ZZ=sin(XX).*sin(YY)./XX./YY;subplot(1,2,2),surf(XX,YY,ZZ),shadinginterp,title('无缝图')NumOfNaN =1817.在时间区间[0,10]中,绘制t-=曲线。
要求分别采取15.0-cosey t2“非向量化编程”和“向量化编程”编写两段程序绘图。
〖解答〗%标量循环运算法t=linspace(0,10,200);N=length(t);y1=zeros(size(t));for k=1:Ny1(k)=1-exp(-0.5*t(k))*cos(2*t(k));endsubplot(1,2,1),plot(t,y1),xlabel('t'),ylabel('y1' ),grid on%数组运算法y2=1-exp(-0.5*t).*cos(2*t);subplot(1,2,2),plot(t,y2),xlabel('t'),ylabel('y2' ),grid on。