MATLAB--实例2(矩阵)

%特殊矩阵-空矩阵、全1矩阵、单位矩阵
%空矩阵
% A=[2 3 4;3 1 5;7 8 4;]
% A(2,:)=[]%删除第二行数
%全一矩阵 ones()
% A=ones(4)
% B=ones(4,3)
% C=zeros(3)
% C(:,:)=1
%单位矩阵 eye()
% A=eye(3);%对角线上都是1
% B=eye(4,5);
% D=zeros(3)
% for m=1:size(D)
%     D(m,m)=1;
% end

%特殊矩阵--几种随机矩阵的生成函数rand,randn,randi,randperm
%rand()默认矩阵生成0--1的数
% A=rand(3);
% A1=rand(3,2);
% A1=rand(3,2,'single');
% A2=rand([3,2]);
% A3=rand(size(A));
% A3=rand(size(A),'like',A1);%like表示数据类型与A1相同
% A4=rand(size(A1,1),size(A2,2));
% A5=4+(5-4)*rand(10);%a,b自己取数,生成a--b的数
 

%randn 跟rand函数差不多,有负数
%randi 生成的是整数,可重复
% A=randi([2,8],5,3);%生成2--8之间的整数,矩阵为五行三列
%randperm 生成的是整数
A=randperm(5) %生成的是1--5之间的整数,不重复,这里生成5个数
B=randperm(10,4)%1--10内生成四个数

%在同一程序中随机数种子的设置
%在程序中调用rand函数时,默认方式是生成不同的随机数,不需要额外进行设置
% a=rand(3)
% a1=rand(3)
% a2=rand(3)

% rng(1)%1为随机数种子,a与a2相同,a与a1不同
% a=rand(2)
% a1=rand(2)
% rng(1)
% a2=rand(2)
%与下面这种用法相同,随机数种子和伪随机生成器联合使用
% rng(1,'twister')
% a=rand(2)
% a1=rand(2)
% rng(1,'twister')
% a2=rand(2)
% s=rng;%将随机数种子记录下来
% a=rand(2)
% a1=rand(2)
% rng(s)
% a2=rand(2)

%软件启动后随机数的设置
%启动软件之后的运行结果
% a =

%     0.8147    0.1270
%     0.9058    0.9134
%关闭后再次启动运行结果
% a =

%     0.8147    0.1270
%     0.9058    0.9134
%每一次启动软件,若不做设置,则生成相同的随机数
%启动软件后作如下设置,可生成不同的随机数
% rng('shuffle')
% a=rand(2)
% a1=rand(2)
% a2=rand(2)
%关闭前后可实验看数据
%rng函数是从2011版本之后出现的,之前的版本是rand('seed',1),rng(1)
rand('seed',1)
a=rand(2)
a1=rand(2)
rand('seed',1)
a2=rand(2)
% 当前的随机数生成函数为旧生成函数。这是因为您执行了 rand('state',0) 之类的命令,该命令会激活 MATLAB 的旧随机数行为。您可能无法使用 RNG 重新设置旧随机数生成函
% 数的种子。

% 请使用 rng('default') 将随机数生成函数重新初始化为其启动配置,或者使用特定的生成函数类型调用 RNG (例如 rng(seed,'twister'))。
 rng('default')

%魔方矩阵和对角矩阵
%魔方矩阵
% A=magic(5)
% % a=sum(A,1)%每一列的和
% % b=sum(A,2)%每一行的和
% b=0;
% for m=1:size(A,1)
%     b=b+A(m,m);
% end
% c=trace(A)%把矩阵A的对角线之和求出来c

%对角矩阵diag blkdiag
% a=[1 2 3 4]%对角线上的数字
% A=diag(a)
% B=diag(a,1)%向上平移一次B=diag(a,k)k>0则往上平移
% B=diag(a,2)%再次向上平移一次
% C=diag(a,-1)%对角线数向下平移一次
%blkdiag分块矩阵
% a=[2 3 4]
% b=[2;3]
% c=3
% A=blkdiag(a,b,c)
% A =

%      2     3     4     0     0
%      0     0     0     2     0
%      0     0     0     3     0
%      0     0     0     0     3

%范德蒙矩阵
V=[2 3 8 9]
A=vander(V)
V1=[2;3;4;5]
A1=vander(V1)

范德蒙自编函数:

function C=fandem(V)
n=max(size(V))
k=n:-1:1;
for i=1:n
    C(:,k(i))=V.^(i-1)
end

%写文件操作fopen fprintf fclose
%fopen
% fid=fopen('a.txt','r');%如果文件不存在,返回值为-1
% fid1=fopen('b.txt','w');%w控制存入数据,存入时,会清空b.txt中的内容,然后再存入数据
% fid2=fopen('b.txt','a');%同样也是存入数据,会在b.txt后面追加数据,存入txt文件中时,可写为at
%fprintf
a=2;
fprintf('变量a的值为:%d\r\n',a)% %d可控制打印整数,%f为小数,%s是字符串

i=1;
fid=fopen('student.txt','w')
while 1
    fprintf('请输入第%d个学生的信息:\n',i);
    name=input('姓名:','s');
    fprintf(fid,'姓名:%s  ',name);
    stu(i).name=name;
    age=input('年龄:');
    fprintf(fid,'年龄:%d  ',age);
    stu(i).age=age;
    sex=input('性别:','s');
    fprintf(fid,'性别:%s  ',sex);
    stu(i).sex=sex;
    score=input('请输入语数外成绩([语 数 外]:\n');
    fprintf(fid,'语文:%.2f\t数学:%.2f\t外语:%.2f\r\n',score(1),score(2),score(3));
    stu(i).score=score;
    S=input('是否继续(Y/N):\n','s');
    if S=='N'
        break;
    end
    i=i+1;
end

%元胞cell
A=cell(2,2)
%元胞赋值,一个一个输入
B{1,1}=3;
B{1,2}='51zxw';
B{2,1}=[2 4;3 4];
a.name='xiao';a.age=12;
B{2,2}=a;
C={5,'52zxw';[2 4;3 4],a};
%读取数据使用大括号
D=C{1,2};
fprintf('该字符串为:%s\n',D);
%读取元胞里矩阵具体元素
E=C{2,1}(1,2);
F=C{1,2}(1,:);
%读取元胞当中结构体的属性值
G=C{2,2}.name;
H=C{2,2}.age
%关于元胞的函数iscell
A1={'xiao',12;[1 2 3;4 5 6],struct('name','xiao','age',23)};
e=iscell(A1);
%显示元胞数组中的内容celldisp cellplot
celldisp(A1);
cellplot(A1);

%希尔伯特矩阵
%hilb
A=hilb(4);
% A1=hilb(3,2)%报错
A1=hilbt(4);
A2=hilbt(4,3);

%希尔伯特矩阵自编函数

function C=hilbt(varargin)
%varargin可以接受变数量的参数
%nargin输入变量的个数
if nargin==0
    C=[];
   warning('输入为空'); 
end
n=varargin{1}
if nargin==1
    for i=1:n
        for j=1:n
            C(i,j)=1/(i+j-1);
        end
    end
end
if nargin>=2
    for i=1:varargin{1}
        for j=1:varargin{2}
            C(i,j)=1/(i+j-1);
        end
    end
    warning('输入的参数数量大于等于2,取前两个为行和列');
end

%帕斯卡矩阵 pascal
A=pascal(3);
A1=pasica(3);
a=A-A1;

%帕斯卡矩阵 pasica自编函数

function P=pasica(n)
if n==0
    warning('输入数字为0');
    return;
end
P=zeros(n);
P(1,:)=1;
P(:,1)=1;
for m=2:n
    for n=2:n
        P(m,n)=P(m-1,n)+P(m,n-1);
    end
end

%托普利斯矩阵 
%toeplitz
C=[2 3 4 5 6];
D=[3 2 3 7 9];
A=toeplitz(C,D);
B=tupulizi(C,D);
a=A-B;

%托普利斯矩阵 自编函数

function P=tupulizi(varargin)
if nargin==1
    P1=varargin{1};
    m=size(P1,2);
    P=zeros(m);
    P(1,:)=P1;
    P(:,1)=P1;
    for k=2:m
        for h=2:m
            P(k,h)=P(k-1,h-1);
        end
    end
end
if nargin==2
    P1=varargin{1};
    P2=varargin{2};
    m=size(P1,2);
    n=size(P2,2);
    P=zeros(m,n);
    P(1,:)=P2;%注意先输入的是列向量,所以第一行为P2
    P(:,1)=P1;
    if P1(1)~=P2(1)
        disp('第一行与第一列元素不相同,以列为主');
    end
    for k=2:m
        for h=2:n
            P(k,h)=P(k-1,h-1);
        end
    end
end

%矩阵的旋转操作rot90
 A=[1 2 3 ;4 5 6;7 8 9;5 3 1]
% % B=rot90(A,n)%n代表逆时针旋转n*90度
% B1=rot90(A,2)
% %左右翻转函数 fliplr()
% B2=fliplr(A);
% %上下反转操作 flipud()
 B3=flipud(A);
 B4=shangxia(A);

% %上下反转操作 自写函数shangxia()

function A=shangxia(A)

m=size(A,1);
if rem(m,2)==1, n=(m-1)/2; 
else 
  n=m/2;
end
for i=1:n
    B=A(i,:);
    A(i,:)=A(m-i+1,:)
    A(m-i+1,:)=B;
end

猜你喜欢

转载自blog.csdn.net/weixin_42107106/article/details/82831351