MATLAB基础知识【7】稀疏矩阵,水仙花数

3 阅读6分钟

稀疏矩阵(Sparse Matrix)

S = sparse([1 3 2 1 4], [3 1 4 1 4], [1 2 3 4 5 ], 4, 4)
%行索引:[1 3 2 1 4]
%列索引:[3 1 4 1 4]
%非零元素的值:[1 2 3 4 5]
%44
full(S)

ans =

     4     0     1     0

对角线元素创建稀疏矩阵

B = [1 2 3; 4 5 6; 7 8 9; 10 11 12];
d = [-3 0 2];
A = spdiags(B, d, 7,4);
disp(A)

d = [-3 0 2];:定义一个包含对角线偏移量的向量 d。这里的偏移量表示相对于主对角线的位置,-3 表示在主对角线之下第三条对角线,0 表示主对角线,2 表示在主对角线之上第二条对角线。 A = spdiags(B, d, 7, 4);:使用 spdiags 函数构建一个 7x4 的稀疏矩阵 A。spdiags 函数的第一个参数 B 是一个矩阵,它的对角线元素将被提取或用于填充新的稀疏矩阵。第二个参数 d 是一个向量,表示要提取或填充的对角线偏移量。第三个参数 7 表示稀疏矩阵的行数,第四个参数 4 表示稀疏矩阵的列数。(自动补足)

稀疏矩阵子矩阵

A = [1 0 0 ; 0 0 1; 1 2 0];
B = sparse(A);
C = sparse(cat(1, full(B), A));
%cat(1, full(B), A) 的结果是一个 6x3 的矩阵,其中前 3 行是矩阵 B 的全矩阵形式,后 3 行是矩阵 A 的内容

cat 函数

cat 函数可以根据指定的维度将两个或多个数组拼接在一起

C = cat(dim, A, B, ...)

其中,dim 指定拼接的维度,A, B, ... 是要拼接的数组。 1.dim = 1:表示按行(垂直方向)进行拼接。 2.full(B):将稀疏矩阵 B 转换为全矩阵。 3.A:原始矩阵 A

稀疏矩阵交换

% 假设 S 是一个已经存在的稀疏矩阵
S = [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1];
% 创建一个索引向量,用于重新排列行
index_vector = [3, 2, 1, 4];
% 使用索引向量重新排列稀疏矩阵的行
S_swapped = S(index_vector, :);

稀疏矩阵视图

B = bucky;
%B = bucky;
spy(B)
%可视化稀疏矩阵的非零元素的位置

bucky 是 MATLAB 中预定义的一个稀疏矩阵,它是一个具有 34 节点和 68 条边的图,形状类似于一个足球。这个矩阵通常用于演示稀疏矩阵的操作。

多维数组

A(3, 3, 3) = 1
%第3行、第3列、第3层的元素设置为1
B(3, 4, :) = 1:4
%第3行、第4列的所有层的元素设置为向量 1:4

构建多维数组

B = cat(2, ones(2, 3), ones(2, 3)*2, ones(2, 3)*3)
%沿2维方向扩展
B = cat(1, ones(2, 3), ones(2, 3)*2, ones(2, 3)*3)
B = cat(4, ones(2, 3), ones(2, 3)*2, ones(2, 3)*3)
repmat([1, 2; 3, 4; 5, 6], [1, 2, 3])
%列方向上重复 2 次,在第三个维度上重复 3
A = reshape(1: 60, 5, 4, 3)
%长度为60的向量重新排列成一个5x4x3的三维矩阵

多维数组重构

A = reshape(1 : 18, 2, 3, 3);
B = flipdim(A, 1);
%以维度1进行中心对称变换
C = flipdim(A, 3);
D = shiftdim(A, 1)
%将各维度左移一格
F = permute(A, [3, 2 ,1])
%原数组的第三个维度变为第一个维度,第二个维度保持不变,第一个维度变为第三个维度

多项式

A = [11, 12, 13; 14, 15, 16; 17, 18, 19];
PA = poly(A)
%poly生成系数向量,若为方阵,则为特征多项式
PPA = poly2str(PA, 's')
%将多项式对象转换成字符串

求(s^2+2)(s+4)(s+1)/(s^3+s+1)

p1 = conv([0, 1, 2], conv([1, 4], [1, 1]));
%将两个多项式的每一项相乘,并将结果相加
p2 = [1 0 1 1];
[q, r] = deconv(p1, p2);
%econv 函数对两个多项式 p1 和 p2 进行多项式除法
cq = '商多项式为';
cr = '余多项式为';
disp([cq poly2str(q, 's')]), disp([cr poly2str(r, 's')]);

字符串查找

%逐个提取并显示字符串 t 中的单词
t = 'I have walked with out on a handful of movies in my life.';
remain = t;
%将字符串 t 赋值给变量 remain
while true
[str, remain] = strtok(remain);
%用 strtok 函数从 remain 中提取下一个单词。strtok 函数会返回两个值:第一个是提取出的单词 str,第二个是剩余的字符串 remain。strtok 函数会自动跳过空格和标点符号
if isempty(str), break; end
%检查提取出的单词 str 是否为空。如果为空,说明已经提取完所有单词,此时跳出循环
disp(sprintf('%s', str))
end

练习

a=linspace(0,1,6);
%linspace 函数用于生成一个指定范围内等间距的数值向量
A = diag(2007 * ones(10,1));
%ones(10,1)创建了一个10行1列的全1矩阵。然后,将其与2007相乘
B = 10-10.*eye(10,10);
%10-10.*eye(10,10):将10减去上述矩阵的每个元素,得到一个10x10的矩阵,其中对角线上的元素为0,其他元素为10
C = A + B;
[V, D] = eig(C);
%特征向量矩阵 V 和特征值对角矩阵 D
function y=Q5F(x)
if x>=-1&&x<0 
%&&是逻辑与运算符,用于连接多个条件表达式
    y=x+1;
elseif x>=0&&x<1
    y=1;
elseif x>=1&&x<=2
    y=x^2;
end
figure
x=-1:0.01:2;
%x=-1:0.01:2;:生成一个从-1到2,步长为0.01的向量x
n=length(x);
%n=length(x);:计算向量x的长度,即元素个数
for i=1:n
%y(i)=Q5F(x(i));:在每次循环中,计算Q5F(x(i))的值,并将其赋值给向量y的第i个元素。这样,向量y就包含了函数Q5F(x)在向量x对应输入值下的输出值
y(i)=Q5F(x(i));
end
plot(x,y)
c=mod((i-100*a),10)
%mod((i-100*a),10) 计算了 (i-100*a) 除以 10 的余数

水仙花数

floor 函数在 MATLAB 中用于向下取整,即返回小于或等于给定数值的最大整数

t=0;
%用于记录找到的水仙花数的个数
for i=100:999
    a=floor(i/100);  %得到百位数
    % floor(i/100) 计算出当前数字的百位数 a
    b=floor((i-100*a)/10);
    c=i-100*a-10*b;%或 ;   c=mod((i-100*a),10) 
    if i==a^3+b^3+c^3
        t=t+1;
        shui(t)=i;
        fprintf('第%d个水仙花数是%d\n',t,i)
    end
end

较大元素

a=[1,2,5;3,6,-4];
b=[8,-7,4;3,6,2];
c=find(a>b); 
% find 函数找出 a 大于 b 的所有元素的线性索引
[l,k]=ind2sub(size(a),c);
%ind2sub 函数用于将线性索引 c 转换为矩阵 a 的行列索引
for i=1:length(l)
    fprintf('a中大于b的第%d个元素坐标为:(%d %d)\n',i,l(i),k(i))
end

绘图

t=0:0.5:100;
y1=exp(-0.1*t+1);
y2=exp(-0.2*t+1);
y3=exp(-0.5*t+1);
plot(t,y1,'-ob',t,y2,':*r',t,y3,'-.^g')
%t,y1,'-ob'表示用蓝色实线(-o)绘制y1的图像,圆圈(o)标记数据点
%t,y2,':*r'表示用红色点划线(:*)绘制y2的图像,星号(*)标记数据点
%t,y3,'-.^g'表示用绿色虚线(-.)绘制y3的图像,三角形(^)标记数据点
title('y=exp(-a*t+1)')
legend('a=0.1','a=0.2','a=0.5')