精华内容
下载资源
问答
  • matlab绘制矩阵色块图

    万次阅读 多人点赞 2018-06-09 20:12:48
    在R语言中有根据矩阵绘制色块图的程序,可以用于绘制相关系数矩阵图,用丰富的颜色和形状形象的展示矩阵元素值的大小。今天介绍的是如何用matlab绘制矩阵色块图。 1、绘制网格线,网格中显示矩阵元素,显示黑色...

                                       matlab绘制矩阵色块图

    本博客参考谢中华 (天津科技大学理学院数学系副教授)老师一书           

    在R语言中有根据矩阵绘制色块图的程序,可以用于绘制相关系数矩阵图,用丰富的颜色和形状形象的展示矩阵元素值的大小。今天介绍的是如何用matlab绘制矩阵色块图。

    1、绘制网格线,网格中显示矩阵元素,显示黑色文字。

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',XVarNames);

    效果图如下:

    2、根据矩阵元素值自动设置文字颜色。

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'FillStyle','nofill','XVarNames',XVarNames,'YVarNames',XVarNames,'TextColor','Auto','ColorBar','on');

    效果图如下:

    3、绘制实值矩阵各元素对应的色块,通过不同的“参数/参数值”控制色块的形状、大小、颜色等属性。 
    方形色块,充满方格,灰白色字体。

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'TextColor',[0.6,0.6,0.6],'ColorBar','on');

    效果图如下:

    4、方形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体。

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','off','FigSize','Auto','ColorBar','on');

    效果图如下:

    5、椭圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体。

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','off','FigSize','Auto','ColorBar','on','FigShape','e');

    效果图如下:

    6、圆形色块,根据矩阵元素值自动确定色块的大小和颜色,不显示字体,上三角形式显示。

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','off','FigSize','Auto','ColorBar','on','FigShape','c','FigStyle','Triu');

    效果图如下:

    7、六边形色块,根据矩阵元素值自动确定色块的大小和颜色,显示字体,下三角形式显示

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','on','FigSize','Auto','ColorBar','on','FigShape','h','FigStyle','Tril');

    效果图如下:

    8、表盘形色块,根据矩阵元素值自动确定色块的颜色,不显示字体

     x = [1.0000    0.1302    0.0582    0.0169    0.0779    0.0833   -0.0313
        0.1302    1.0000    0.0482    0.3843    0.2105   -0.2500    0.0803
        0.0582    0.0482    1.0000    0.0481    0.3515   -0.0426    0.0574
        0.0169    0.3843    0.0481    1.0000   -0.1819   -0.3554   -0.0020
        0.0779    0.2105    0.3515   -0.1819    1.0000    0.0388    0.0186
        0.0833   -0.2500   -0.0426   -0.3554    0.0388    1.0000   -0.1853
       -0.0313    0.0803    0.0574   -0.0020    0.0186   -0.1853    1.0000];
    XVarNames = {'Sleep','Age','Sex','Rel','Psy','Ner','Cha'};
    matrixplot(x,'XVarNames',XVarNames,'YVarNames',XVarNames,'DisplayOpt','off','FigSize','Full','ColorBar','on','FigShape','d');

    效果图如下:

     最后贴上matrixplot函数的源码,源码中有详细的调用格式及参数说明,可以通过设置不同参数。感兴趣的朋友可以自己设置不同的参数。

    function matrixplot(data,varargin)
    %   根据实值矩阵绘制色块图,用丰富的颜色和形状形象的展示矩阵元素值的大小。
    %
    %   matrixplot(data) 绘制矩阵色块图,data为实值矩阵,每一个元素对应一个色块,色
    %                    块颜色由元素值大小决定。
    %
    %   matrixplot(data, 'PARAM1',val1, 'PARAM2',val2, ...) 
    %          用成对出现的参数名/参数值控制色块的各项属性。可用的参数名/参数值如下:
    %          'FigShape' --- 设定色块的形状,其参数值为:
    %                'Square'  --- 方形(默认)
    %                'Circle'  --- 圆形
    %                'Ellipse' --- 椭圆形
    %                'Hexagon' --- 六边形
    %                'Dial'    --- 表盘形
    %
    %          'FigSize' --- 设定色块的大小,其参数值为:
    %                'Full'    --- 最大色块(默认)
    %                'Auto'    --- 根据矩阵元素值自动确定色块大小
    %
    %          'FigStyle' --- 设定矩阵图样式,其参数值为:
    %                'Auto'    --- 矩形矩阵图(默认)
    %                'Tril'    --- 下三角矩阵图
    %                'Triu'    --- 上三角矩阵图
    %
    %          'FillStyle' --- 设定色块填充样式,其参数值为:
    %                'Fill'    --- 填充色块内部(默认)
    %                'NoFill'  --- 不填充色块内部
    %
    %          'DisplayOpt' --- 设定是否在色块中显示矩阵元素值,其参数值为:
    %                'On'      --- 显示矩阵元素值(默认)
    %                'Off'     --- 不显示矩阵元素值
    %
    %          'TextColor' --- 设定文字的颜色,其参数值为:
    %                表示单色的字符('r','g','b','y','m','c','w','k'),默认为黑色
    %                1行3列的红、绿、蓝三元色灰度值向量([r,g,b])
    %                'Auto'    --- 根据矩阵元素值自动确定文字颜色
    %
    %          'XVarNames' --- 设定X轴方向需要显示的变量名(默认为X1,X2,...),其参数值为:
    %                字符串矩阵或字符串元胞数组,若为字符串矩阵,其行数应与data的列数相同
    %                若为字符串元胞数组,其长度应与data的列数相同。
    %
    %          'YVarNames' --- 设定Y轴方向需要显示的变量名(默认为Y1,Y2,...),其参数值为:
    %                字符串矩阵或字符串元胞数组,若为字符串矩阵,其行数应与data的行数相同
    %                若为字符串元胞数组,其长度应与data的行数相同。
    %
    %          'ColorBar' --- 设定是否显示颜色条,其参数值为:
    %                'On'      --- 显示颜色条
    %                'Off'     --- 不显示颜色条(默认)
    %
    %          'Grid' --- 设定是否显示网格线,其参数值为:
    %                'On'      --- 显示网格线(默认)
    %                'Off'     --- 不显示网格线
    %
    %   Example:
    %   x = [1,-0.2,0.3,0.8,-0.5
    %        -0.2,1,0.6,-0.7,0.2
    %         0.3,0.6,1,0.5,-0.3
    %         0.8,-0.7,0.5,1,0.7
    %        -0.5,0.2,-0.3,0.7,1];
    %   matrixplot(x);
    %   matrixplot(x,'DisplayOpt','off');
    %   matrixplot(x,'FillStyle','nofill','TextColor','Auto');
    %   matrixplot(x,'TextColor',[0.7,0.7,0.7],'FigShap','s','FigSize','Auto','ColorBar','on');
    %   matrixplot(x,'TextColor','k','FigShap','d','FigSize','Full','ColorBar','on','FigStyle','Triu');
    %   XVarNames = {'xiezhh','heping','keda','tust','tianjin'};
    %   matrixplot(x,'FigShap','e','FigSize','Auto','ColorBar','on','XVarNames',XVarNames,'YVarNames',XVarNames);
    % 对第一个输入参数类型进行判断
    if ~ismatrix(data) || ~isreal(data)
        error('输入参数类型不匹配:第一个输入参数应为实值矩阵');
    end
    
    % 解析成对出现的参数名/参数值
    [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,XVarNames,...
        YVarNames,ColorBar,GridOpt] = parseInputs(varargin{:});
    
    % 产生网格数据
    [m,n] = size(data);
    [x,y] = meshgrid(0:n,0:m);
    data = data(:);
    maxdata = nanmax(data);
    mindata = nanmin(data);
    rangedata = maxdata - mindata;
    if isnan(rangedata)
        warning('MATLAB:warning1','请检查您输入的矩阵是否合适!');
        return;
    end
    z = zeros(size(x))+0.2;
    sx = x(1:end-1,1:end-1)+0.5;
    sy = y(1:end-1,1:end-1)+0.5;
    
    if strncmpi(FigStyle,'Tril',4)
        z(triu(ones(size(z)),2)>0) = NaN;
        sx(triu(ones(size(sx)),1)>0) = NaN;
    elseif strncmpi(FigStyle,'Triu',4)
        z(tril(ones(size(z)),-2)>0) = NaN;
        sx(tril(ones(size(sx)),-1)>0) = NaN;
    end
    sx = sx(:);
    sy = sy(:);
    id = isnan(sx) | isnan(data);
    sx(id) = [];
    sy(id) = [];
    data(id) = [];
    
    if isempty(XVarNames)
        XVarNames = strcat('X',cellstr(num2str((1:n)')));
    else
        if (iscell(XVarNames) && (numel(XVarNames) ~= n)) || (~iscell(XVarNames) && (size(XVarNames,1) ~= n))
            error('X轴方向变量名应为字符串矩阵或字符串元胞数组,其长度与输入矩阵的列数相同');
        end
    end
    if isempty(YVarNames)
        YVarNames = strcat('Y',cellstr(num2str((1:m)')));
    else
        if (iscell(YVarNames) && (numel(YVarNames) ~= m)) || (~iscell(YVarNames) && (size(YVarNames,1) ~= m))
            error('Y轴方向变量名应为字符串矩阵或字符串元胞数组,其长度与输入矩阵的行数相同');
        end
    end
    
    % 绘图
    figure('color','w',...
        'units','normalized',...
        'pos',[0.289165,0.154948,0.409956,0.68099]);
    axes('units','normalized','pos',[0.1,0.022,0.89,0.85]);
    if strncmpi(GridOpt,'On',2)
        mesh(x,y,z,...
            'EdgeColor',[0.7,0.7,0.7],...
            'FaceAlpha',0,...
            'LineWidth',1);   % 参考网格线
    end
    hold on;
    axis equal;
    axis([-0.1,n+0.1,-0.1,m+0.1,-0.5,0.5]);
    view(2);
    % 设置X轴和Y轴刻度位置及标签
    set(gca,'Xtick',(1:n)-0.5,...
        'XtickLabel',XVarNames,...
        'Ytick',(1:m)-0.5,...
        'YtickLabel',YVarNames,...
        'XAxisLocation','top',...
        'YDir','reverse',...
        'Xcolor',[0.7,0.7,0.7],...
        'Ycolor',[0.7,0.7,0.7],...
        'TickLength',[0,0]);
    axis off
    
    % 绘制填充色块
    if strncmpi(FillStyle,'Fill',3)
        MyPatch(sx',sy',data',FigShape,FigSize);
    end
    
    % 显示数值文本信息
    if strncmpi(DisplayOpt,'On',2)
        str = num2str(data,'%4.2f');
        scale = 0.1*max(n/m,1)/(max(m,n)^0.55);
        if strncmpi(TextColor,'Auto',3)
            ColorMat = get(gcf,'ColorMap');
            nc = size(ColorMat,1);
            cid = fix(mapminmax(data',0,1)*nc)+1;
            cid(cid<1) = 1;
            cid(cid>nc) = nc;
            TextColor = ColorMat(cid,:);
            for i = 1:numel(data)
                text(sx(i),sy(i),0.1,str(i,:),...
                    'FontUnits','normalized',...
                    'FontSize',scale,...
                    'fontweight','bold',...
                    'HorizontalAlignment','center',...
                    'Color',TextColor(i,:));
            end
        else
            text(sx,sy,0.1*ones(size(sx)),str,...
                'FontUnits','normalized',...
                'FontSize',scale,...
                'fontweight','bold',...
                'HorizontalAlignment','center',...
                'Color',TextColor);
        end
    end
    
    % 设置X轴和Y轴刻度标签的缩进方式
    MyTickLabel(gca,FigStyle);
    
    % 添加颜色条
    if strncmpi(ColorBar,'On',2)
        if any(strncmpi(FigStyle,{'Auto','Triu'},4))
            colorbar('Location','EastOutside');
        else
            colorbar('Location','SouthOutside');
        end
    end
    end
    
    % ---------------------------------------------------
    %  调整坐标轴刻度标签子函数
    % ---------------------------------------------------
    function MyTickLabel(ha,tag)
    
    %   根据显示范围自动调整坐标轴刻度标签的函数
    %   ha   坐标系句柄值
    %   tag  调整坐标轴刻度标签的标识字符串,可用取值如下:
    %        'Auto' --- 将x轴刻度标签旋转90度,y轴刻度标签不作调整
    %        'Tril' --- 将x轴刻度标签旋转90度,并依次缩进,y轴刻度标签不作调整
    %        'Triu' --- 将x轴刻度标签旋转90度,y轴刻度标签依次缩进
    %   Example:
    %   MyTickLabel(gca,'Tril');
    if ~ishandle(ha)
        warning('MATLAB:warning2','第一个输入参数应为坐标系句柄');
        return;
    end
    
    if ~strcmpi(get(ha,'type'),'axes')
        warning('MATLAB:warning3','第一个输入参数应为坐标系句柄');
        return;
    end
    axes(ha);
    xstr = get(ha,'XTickLabel');
    xtick = get(ha,'XTick');
    xl = xlim(ha);
    ystr = get(ha,'YTickLabel');
    ytick = get(ha,'YTick');
    yl = ylim(ha);
    set(ha,'XTickLabel',[],'YTickLabel',[]);
    x = zeros(size(ytick)) + xl(1) - range(xl)/30;
    y = zeros(size(xtick)) + yl(1) - range(yl)/70;
    nx = numel(xtick);
    ny = numel(ytick);
    
    if strncmpi(tag,'Tril',4)
        y = y + (1:nx) - 1;
    elseif strncmpi(tag,'Triu',4)
        x = x + (1:ny) - 1;
    end
    
    text(xtick,y,xstr,...
        'rotation',90,...
        'Interpreter','none',...
        'color','r',...
        'HorizontalAlignment','left');
    text(x,ytick,ystr,...
        'Interpreter','none',...
        'color','r',...
        'HorizontalAlignment','right');
    end
    
    % ---------------------------------------------------
    %  根据散点数据绘制3维色块图子函数
    % ---------------------------------------------------
    function  MyPatch(x,y,z,FigShape,FigSize)
    %   根据散点数据绘制3维色块图
    %   MyPatch(x,y,z,FigShape,FigSize)  x,y,z是实值数组,用来指定色块中心点三维
    %          坐标。FigShape是字符串变量,用来指定色块形状。
    %          FigSize是字符串变量,用来指定色块大小。
    %
    %   Example:
    %         x = rand(10,1);
    %         y = rand(10,1);
    %         z = rand(10,1);
    %         MyPatch(x,y,z,'s','Auto');
    %
    
    % 输入参数类型判断
    if nargin < 3
        error('至少需要三个输入参数');
    end
    if ~isreal(x) || ~isreal(y) || ~isreal(z)
        error('前三个输入应为实值数组');
    end
    
    n = numel(z);
    if numel(x) ~= n || numel(y) ~= n
        error('坐标应等长');
    end
    
    if strncmpi(FigSize,'Auto',3) && ~strncmpi(FigShape,'Ellipse',1)
        id = (z == 0);
        x(id) = [];
        y(id) = [];
        z(id) = [];
    end
    if isempty(z)
        return;
    end
    
    % 求色块顶点坐标
    rab1 = ones(size(z));
    maxz = max(abs(z));
    if maxz == 0
        maxz = 1;
    end
    rab2 = abs(z)/maxz;
    if strncmpi(FigShape,'Square',1)
        % 方形
        if strncmpi(FigSize,'Full',3)
            r = rab1;
        else
            r = sqrt(rab2);
        end
        SquareVertices(x,y,z,r);
    elseif strncmpi(FigShape,'Circle',1)
        % 圆形
        if strncmpi(FigSize,'Full',3)
            r = 0.5*rab1;
        else
            r = 0.5*sqrt(rab2);
        end
        CircleVertices(x,y,z,r);
    elseif strncmpi(FigShape,'Ellipse',1)
        % 椭圆形
        a = 0.48 + rab2*(0.57-0.48);
        b = (1-rab2).*a;
        EllipseVertices(x,y,z,a,b);
    elseif strncmpi(FigShape,'Hexagon',1)
        % 六边形
        if strncmpi(FigSize,'Full',3)
            r = 0.5*rab1;
        else
            r = 0.5*sqrt(rab2);
        end
        HexagonVertices(x,y,z,r);
    else
        % 表盘形
        if strncmpi(FigSize,'Full',3)
            r = 0.45*rab1;
        else
            r = 0.45*sqrt(rab2);
        end
        DialVertices(x,y,z,r);
    end
    end
    %--------------------------------------------------
    % 求色块顶点坐标并绘制色块的子函数
    %--------------------------------------------------
    function SquareVertices(x,y,z,r)
    % 方形
    hx = r/2;
    hy = hx;
    Xp = [x-hx;x-hx;x+hx;x+hx;x-hx];
    Yp = [y-hy;y+hy;y+hy;y-hy;y-hy];
    Zp = repmat(z,[5,1]);
    patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat');
    end
    
    function CircleVertices(x,y,z,r)
    % 圆形
    t = linspace(0,2*pi,30)';
    m = numel(t);
    Xp = repmat(x,[m,1])+cos(t)*r;
    Yp = repmat(y,[m,1])+sin(t)*r;
    Zp = repmat(z,[m,1]);
    patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat');
    end
    
    function EllipseVertices(x,y,z,a,b)
    % 椭圆形
    t = linspace(0,2*pi,30)';
    m = numel(t);
    t0 = -sign(z)*pi/4;
    t0 = repmat(t0,[m,1]);
    x0 = cos(t)*a;
    y0 = sin(t)*b;
    Xp = repmat(x,[m,1]) + x0.*cos(t0) - y0.*sin(t0);
    Yp = repmat(y,[m,1]) + x0.*sin(t0) + y0.*cos(t0);
    Zp = repmat(z,[m,1]);
    patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat');
    end
    
    function HexagonVertices(x,y,z,r)
    % 六边形
    t = linspace(0,2*pi,7)';
    m = numel(t);
    Xp = repmat(x,[m,1])+cos(t)*r;
    Yp = repmat(y,[m,1])+sin(t)*r;
    Zp = repmat(z,[m,1]);
    patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor','flat');
    end
    
    function DialVertices(x,y,z,r)
    % 表盘形
    % 绘制表盘扇形
    maxz = max(abs(z));
    t0 = z*2*pi/maxz-pi/2;
    t0 = cell2mat(arrayfun(@(x)linspace(-pi/2,x,30)',t0,'UniformOutput',0));
    m = size(t0,1);
    r0 = repmat(r,[m,1]);
    Xp = [x;repmat(x,[m,1]) + r0.*cos(t0);x];
    Yp = [y;repmat(y,[m,1]) + r0.*sin(t0);y];
    Zp = repmat(z,[m+2,1]);
    patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor',[0,0,0]);
    
    % 绘制表盘圆周
    t = linspace(0,2*pi,30)';
    m = numel(t);
    Xp = repmat(x,[m,1])+cos(t)*r;
    Yp = repmat(y,[m,1])+sin(t)*r;
    Zp = repmat(z,[m,1]);
    Xp = [Xp;flipud(Xp)];
    Yp = [Yp;flipud(Yp)];
    Zp = [Zp;flipud(Zp)];
    patch(Xp,Yp,Zp,'FaceColor','flat','EdgeColor',[0,0,0]);
    end
    
    %--------------------------------------------------------------------------
    %  解析输入参数子函数1
    %--------------------------------------------------------------------------
    function [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,...
        XVarNames,YVarNames,ColorBar,GridOpt] = parseInputs(varargin)
    
    if mod(nargin,2)~=0
        error('输入参数个数不对,应为成对出现');
    end
    pnames = {'FigShape','FigSize','FigStyle','FillStyle','DisplayOpt',...
        'TextColor','XVarNames','YVarNames','ColorBar','Grid'};
    dflts =  {'Square','Full','Auto','Fill','On','k','','','Off','On'};
    [FigShape,FigSize,FigStyle,FillStyle,DisplayOpt,TextColor,XVarNames,...
        YVarNames,ColorBar,GridOpt] = parseArgs(pnames, dflts, varargin{:});
    
    validateattributes(FigShape,{'char'},{'nonempty'},mfilename,'FigShape');
    validateattributes(FigSize,{'char'},{'nonempty'},mfilename,'FigSize');
    validateattributes(FigStyle,{'char'},{'nonempty'},mfilename,'FigStyle');
    validateattributes(FillStyle,{'char'},{'nonempty'},mfilename,'FillStyle');
    validateattributes(DisplayOpt,{'char'},{'nonempty'},mfilename,'DisplayOpt');
    validateattributes(TextColor,{'char','numeric'},{'nonempty'},mfilename,'TextColor');
    validateattributes(XVarNames,{'char','cell'},{},mfilename,'XVarNames');
    validateattributes(YVarNames,{'char','cell'},{},mfilename,'YVarNames');
    validateattributes(ColorBar,{'char'},{'nonempty'},mfilename,'ColorBar');
    validateattributes(GridOpt,{'char'},{'nonempty'},mfilename,'Grid');
    if ~any(strncmpi(FigShape,{'Square','Circle','Ellipse','Hexagon','Dial'},1))
        error('形状参数只能为Square, Circle, Ellipse, Hexagon, Dial 之一');
    end
    if ~any(strncmpi(FigSize,{'Full','Auto'},3))
        error('图形大小参数只能为Full, Auto 之一');
    end
    if ~any(strncmpi(FigStyle,{'Auto','Tril','Triu'},4))
        error('图形样式参数只能为Auto, Tril, Triu 之一');
    end
    if ~any(strncmpi(FillStyle,{'Fill','NoFill'},3))
        error('图形填充样式参数只能为Fill, NoFill 之一');
    end
    if ~any(strncmpi(DisplayOpt,{'On','Off'},2))
        error('显示数值参数只能为On,Off 之一');
    end
    if ~any(strncmpi(ColorBar,{'On','Off'},2))
        error('显示颜色条参数只能为On,Off 之一');
    end
    if ~any(strncmpi(GridOpt,{'On','Off'},2))
        error('显示网格参数只能为On,Off 之一');
    end
    end
    
    %--------------------------------------------------------------------------
    %  解析输入参数子函数2
    %--------------------------------------------------------------------------
    function [varargout] = parseArgs(pnames,dflts,varargin)
    %   Copyright 2010-2011 The MathWorks, Inc.
    %   $Revision: 1.1.6.2 $  $Date: 2011/05/09 01:27:26 $
    % Initialize some variables
    nparams = length(pnames);
    varargout = dflts;
    setflag = false(1,nparams);
    unrecog = {};
    nargs = length(varargin);
    
    dosetflag = nargout>nparams;
    dounrecog = nargout>(nparams+1);
    
    % Must have name/value pairs
    if mod(nargs,2)~=0
        m = message('stats:internal:parseArgs:WrongNumberArgs');
        throwAsCaller(MException(m.Identifier, '%s', getString(m)));
    end
    
    % Process name/value pairs
    for j=1:2:nargs
        pname = varargin{j};
        if ~ischar(pname)
            m = message('stats:internal:parseArgs:IllegalParamName');
            throwAsCaller(MException(m.Identifier, '%s', getString(m)));
        end
        
        mask = strncmpi(pname,pnames,length(pname)); % look for partial match
        if ~any(mask)
            if dounrecog
                % if they've asked to get back unrecognized names/values, add this
                % one to the list
                unrecog((end+1):(end+2)) = {varargin{j} varargin{j+1}};
                continue
            else
                % otherwise, it's an error
                m = message('stats:internal:parseArgs:BadParamName',pname);
                throwAsCaller(MException(m.Identifier, '%s', getString(m)));
            end
        elseif sum(mask)>1
            mask = strcmpi(pname,pnames); % use exact match to resolve ambiguity
            if sum(mask)~=1
                m = message('stats:internal:parseArgs:AmbiguousParamName',pname);
                throwAsCaller(MException(m.Identifier, '%s', getString(m)));
            end
        end
        varargout{mask} = varargin{j+1};
        setflag(mask) = true;
    end
    
    % Return extra stuff if requested
    if dosetflag
        varargout{nparams+1} = setflag;
        if dounrecog
            varargout{nparams+2} = unrecog;
        end
    end
    end

    小编邮箱:2377389590@qq.com

    小编微信

    小编抖音

     

    欢迎加群:707914447

     

     

    展开全文
  • matlab 矩阵大小及结构的改变

    千次阅读 2020-07-24 11:12:32
    matlab 矩阵大小及结构的改变 函数名称 函数功能 fliplr(A) 矩阵每一行均进行逆序排列 flipud(A) 矩阵每一列军进行逆序排列 flipdim(A,dim) 生成一个在dim维矩阵A内的元素交换位置的多维矩阵 rot90(A)...

    matlab 矩阵大小及结构的改变

    函数名称 函数功能
    fliplr(A) 矩阵每一行均进行逆序排列
    flipud(A) 矩阵每一列军进行逆序排列
    flipdim(A,dim) 生成一个在dim维矩阵A内的元素交换位置的多维矩阵
    rot90(A) 生成一个由矩阵A逆时针旋转90度而得到的新矩阵
    rot90(A,k) 生成一个由矩阵A逆时针旋转k*90度而得到的新矩阵
    reshape(A,m,n) 生成一个m*n维的矩阵
    repmat(A,[m n…p]) 创建一个和矩阵A有相同元素的多维矩阵
    shiftdim(A,n) 矩阵的列移动n步
    squeeze(A) 返回没有空维的矩阵A
    cat(dim,A,B) 将矩阵A和B组合成一个dim维的多维矩阵
    permute(A,order) 根据向量order来改变矩阵A中的维数顺序
    ipermute(A,order) 进行命令permute的逆变换
    sort(A) 对一维或二维矩阵进行升序排序
    sort(A,dim) 对矩阵按指定放行进行升序排序dim=1每一列排序,dim=2每一行排序
    sort(A,dim,mode) mode为‘ascend’进行升序排序,‘descend’降序排序
    [B,IX]=sort(A,…) IX为排序后备元素在原矩阵中的位置的索引
    展开全文
  • MATLAB稀疏矩阵

    2019-01-03 12:02:30
    稀疏矩阵稀疏矩阵是一种...7.1 稀疏矩阵的存储方式对一般矩阵而言,MATLAB保存矩阵内的每一个元素,矩阵中的零元素与其他元素一样,需要占用同样大小的内存空间。但对于稀疏矩阵MATLAB仅存储稀疏矩阵中的非零元...

    稀疏矩阵稀疏矩阵是一种特殊类型的矩阵,即矩阵中包括较多的零元素。对于稀疏矩阵的这种特性,在MATLAB中可以只保存矩阵中非零元素及非零元素在矩阵中的位置。在用稀疏矩阵进行计算时,通过消去零元素可以减少计算的时间。7.1 稀疏矩阵的存储方式对一般矩阵而言,MATLAB保存矩阵内的每一个元素,矩阵中的零元素与其他元素一样,需要占用同样大小的内存空间。但对于稀疏矩阵,MATLAB仅存储稀疏矩阵中的非零元素及其对应的位置,其他空余位置只是在访问时以默认的零元素来填充。对于一个含有大量零元素的大型矩阵,采用这种方法可以大大地减少数据占据的内存空间。MATLAB采用3个内部数组来保存元素为实数的稀疏矩阵。稀疏矩阵也可用于存储复数。当稀疏矩阵用于存储复数数据时,需用第4个内部数组保存非零复数的虚部。一个复数非零,是指其实部或虚部至少其中一个不为零。【例2-16】 稀疏矩阵与一般矩阵的内存占用对比。>> M_full = magic(1100); % 创建一个1100´1100 矩阵>> M_full(M_full > 50) = 0; % 将>50的元素设置为0>> M_sparse = sparse(M_full); % 创建稀疏矩阵>> whos Name Size Bytes Class Attributes M_full 1100x1100 9680000 double M_sparse 1100x1100 9608 double sparse 本例中,M_full和 M_sparse两个变量存储的实际上是同一个矩阵,但是二者因为采用的存储形式分别为一般矩阵和稀疏矩阵,所以占用的内存量却相差了近1000倍。因为MATLAB版本不同,操作系统不同(例如32位和64位),内部存储格式也有些变化,但总体上来说占用的内存空间比一般矩阵小很多。7.2 稀疏矩阵的创建MATLAB决不会自动地创建一个稀疏矩阵,这需要用户来决定是否使用稀疏矩阵。在创建一个矩阵前,用户需要根据此矩阵中是否包含较多的零元素,采用稀疏矩阵技术是否有利,来决定是否采用稀疏矩阵的形式。把矩阵中非零元素的个数除以所有元素的个数,就叫做矩阵的密度,密度越小的矩阵采用稀疏矩阵的格式越有利。要将一般矩阵转换为稀疏矩阵,可以使用函数sparse,如s=sparse (A),是指将矩阵A转换为稀疏矩阵。另外,使用函数full则可把稀疏矩阵转换为一般矩阵。【例2-17】 一般矩阵与稀疏矩阵的转换示例。>> A=[0 0 0 1;0 1 0 0;1 2 0 0;0 0 3 0]A = 0 0 0 1 0 1 0 0 1 2 0 0 0 0 3 0>> s=sparse(A)s = (3,1) 1 (2,2) 1 (3,2) 2 (4,3) 3 (1,4) 1>> B=full(s)B = 0 0 0 1 0 1 0 0 1 2 0 0 0 0 3 0从本例的结果中可以看出所有s的非零元素列表及其对应的行列序号。所有非零元素保存在一列中,反映了数据的内部结构。稀疏矩阵的创建一般有以下几种方式。1.直接创建稀疏矩阵使用函数sparse,可以用一组非零元素直接创建一个稀疏矩阵。该函数调用格式为:S=sparse(i,j,s,m,n)其中i和j都为矢量,分别是指矩阵中非零元素的行号与列号,s是一个全部为非零元素矢量,元素在矩阵中排列的位置为(i,j)。m为输出的稀疏矩阵的行数,n为输出的稀疏矩阵的列数。【例2-18】 稀疏矩阵的创建。>> S=sparse([1 3 2 1 4],[3 1 4 1 4],[1 2 3 45],4,4)S = (1,1) 4 (3,1) 2 (1,3) 1 (2,4) 3 (4,4) 5>> full(S)ans = 4 0 1 0 0 0 0 3 2 0 0 0 0 0 0 5本例中通过sparse函数直接创建了稀疏矩阵S。sparse函数中的前两个输入变量[1 3 2 1 4]和[3 1 4 1 4]就是元素在矩阵中排列的位置,第3个输入变量[1 2 3 4 5]就是稀疏矩阵前面两个输入变量中的位置所对应的元素的值,而最后的两个输入变量4是指输出的稀疏矩阵的行数是4,输出的稀疏矩阵的列数同样也为4。通过full函数把稀疏矩阵转换为一般矩阵,这样就可以清楚地看出sparse函数输入和输出之间的关系。需要指出的是:函数sparse还有一个变化形式,可以设置最大数目的非零元素。如有必要,可以在函数sparse中添加第6个输入参数,设置稀疏矩阵中非零元素的最大数目,这样以后要在矩阵中添加非零元素,就无需再修改矩阵的结构。具体的使用方法请查阅help文档。2.从对角线元素中创建稀疏矩阵要将一个矩阵的对角线元素保存在一个稀疏矩阵中,可以使用函数spdiags。其调用格式为:S=spdiags(B,d,m,n)函数spdiags用于创建一个尺寸为m行n列的稀疏矩阵S,其非零元素来自矩阵B中的元素且按对角线排列,参数d指定矩阵B中用于生成稀疏矩阵B的对角线位置。矩阵的主对角线可以认为是第0条对角线,每向右上移动一条对角线编号加1,向左下移动一条对角线编号减1,也就是说B中的j列填充矢量d元素,j指定对角线。【例2-19】 稀疏矩阵的创建。>> B=[1 2 3;4 5 6;7 8 9;10 11 12]B = 1 2 3 4 5 6 7 8 9 10 11 12>> d=[-3 0 2]d = -3 0 2>> A=spdiags(B,d,7,4) A = (1,1) 2 (4,1) 1 (2,2) 5 (5,2) 4 (1,3) 9 (3,3) 8 (6,3) 7 (2,4) 12 (4,4) 11 (7,4) 10>> full(A)ans = 2 0 9 0 0 5 0 12 0 0 8 0 1 0 0 11 0 4 0 0 0 0 7 0 0 0 0 10本例生成了一个7行4列的稀疏矩阵A。B的第1列元素排列在主对角线以下的第3条对角线上,第2列元素排列在主对角线上,第3列中的非零元素排列在主对角线上方的第2条对角线上。这里需要注意B中的第三列并没有全部分布在第2条对角线上,而是最后两个元素9和12排列在该对角线上。3.从外部文件中导入稀疏矩阵用外部文件创建的文本文件,如果该文件中的数据按3或者4列排列,则可将这个文本文件载入内存,用于创建一个稀疏矩阵。【例2-20】 稀疏矩阵的创建。假如有这样一个文件uphill.dat(用户可以通过记事本打开、编辑其内容),文件内含有以下数据:1 1 1.0000000000000001 2 0.5000000000000002 2 0.3333333333333331 3 0.3333333333333332 3 0.2500000000000003 3 0.2000000000000001 4 0.2500000000000002 4 0.2000000000000003 4 0.1666666666666674 4 0.1428571428571434 4 0.000000000000000那么通过使用load命令可以将此数据文件载入MATLAB,然后对其进行操作。实际中用户可以在命令窗口输入:>> load uphill.dat % 用load命令将数据的文本文件uphill.dat载入工作空间>> H = spconvert(uphill)H = (1,1) 1.0000 (1,2) 0.5000 (2,2) 0.3333 (1,3) 0.3333 (2,3) 0.2500 (3,3) 0.2000 (1,4) 0.2500 (2,4) 0.2000 (3,4) 0.1667 (4,4) 0.1429> >> full(H)ans = 1.0000 0.5000 0.3333 0.2500 0 0.3333 0.2500 0.2000 0 0 0.2000 0.1667 0 0 0 0.1429本例首先使用load函数导入了一个3列数据的文本文件uphill.dat,用户可以通过在命令行中输入变量名uphill 可以查看数据uphill 中的具体内容来验证数据读取是否正确,然后调用spconvert将uphill 转换为相应的稀疏矩阵H。通过调用full函数可以直观地看出得到的稀疏矩阵。MATLAB使用load函数来导入外部数据文件,具体的用法可以参阅第10章。7.3 稀疏矩阵的运算多数MATLAB自带的数学函数都可用于处理稀疏矩阵,此时可以将稀疏矩阵当做一般矩阵看待。另外MATLAB也提供有一些专门针对稀疏矩阵的函数。处理稀疏矩阵时,计算的复杂程度与稀疏矩阵中非零元素的数目成正比,也与矩阵的行列尺寸有关。比如稀疏矩阵的乘法、乘方、包含一定次数的线性方程组等,都是比较复杂的运算。用函数处理稀疏矩阵时,计算结果要遵循以下一些原则。(1)MATLAB函数处理一个矩阵时,不管这个矩阵是一般矩阵还是稀疏矩阵,其返回值为一个数值或矩阵。返回值都按一般矩阵方式进行保存,并不会根据接受的参数是稀疏矩阵,而将结果保存为稀疏矩阵。(2)函数处理一个数值或矢量返回一个矩阵时,如果矩阵为零矩阵、元素全为1的矩阵、随机矩阵或单位矩阵,这些矩阵全为一般矩阵形式。对于零矩阵,有一种类似稀疏矩阵的存储方法,因为零矩阵中没有非零元素,所以不能将一个零矩阵转换为一个稀疏矩阵,但指令zeros(m,n)和sparse(m,n)是可用的。对于单位矩阵和随机矩阵,可以使用类似稀疏矩阵的操作指令,即speye和sprand。对于元素全为1的矩阵,则没有类似的操作指令。(3)以矩阵为参数返回矩阵或矢量的一元函数,返回值的存储类型与参数的存储类型相同。例如矩阵S的cholesky分解,如果S为一般矩阵,结果也为一般矩阵;如果S为稀疏矩阵,结果也为稀疏矩阵。对于列向处理矩阵的函数,如求各列最大值的函数max,求各列之和的函数sum等,也都返回与参数相同的存储类型。如果参数是稀疏矩阵,即使返回的矩阵或矢量全为非零元素,也用稀疏方式表示。例外情况只有函数sparse和full,因为它们用于一般矩阵和稀疏矩阵之间的转换。(4)对于有两个输入参数为矩阵的情况,如果输入的两个矩阵都为稀疏矩阵,则输出仍为稀疏矩阵;都为一般矩阵,结果也为一般矩阵。如果输入参数一个为稀疏矩阵,一个为一般矩阵,结果通常为一般矩阵,但在能够保证矩阵稀疏性不变的运算中,结果则为稀疏矩阵。(5)使用方括号对矩阵进行组合时,如果组合的矩阵中有稀疏矩阵,结果则为稀疏矩阵。(6)子矩阵在右边的赋值操作,返回值为右边子矩阵的储存类型,子矩阵在左边赋值不改变其储存类型。【例2-21】 稀疏矩阵的组合。>> A=[1 0 0;0 0 1;1 2 0]A = 1 0 0 0 0 1 1 2 0>> B=sparse(A)B = (1,1) 1 (3,1) 1 (3,2) 2 (2,3) 1>> C=[A(:,1),B(:,2)]C = (1,1) 1 (3,1) 1 (3,2) 2本例将矩阵A的第1列和矩阵B的第2列组成了新的矩阵C,从结果可知,C为稀疏矩阵。【例2-22】 稀疏矩阵子矩阵的赋值。>> A=[1 0 0;0 0 1;1 2 0];>> B=sparse(A);>> C=sparse(cat(1,full(B),A))C = (1,1) 1 (3,1) 1 (4,1) 1 (6,1) 1 (3,2) 2 (6,2) 2 (2,3) 1 (5,3) 1>> i=[1 2 3];>> j=[1 2 3];>> T=C(i,j)T = (1,1) 1 (3,1) 1 (3,2) 2 (2,3) 1>> C(j,i)=full(T) % 将一般矩阵赋值给一稀疏矩阵,仍返回稀疏矩阵C = (1,1) 1 (3,1) 1 (4,1) 1 (6,1) 1 (3,2) 2 (6,2) 2 (2,3) 1 (5,3) 17.4 稀疏矩阵的交换与重新排序稀疏矩阵S的行交换与列交换可以用以下两种方法表示。(1)对于交换矩阵P,对稀疏矩阵S进行行交换可表示为PS,进行列交换可表示为PS’。(2)对于一个交换矢量p,p为一般矢量包含1到n个自然数的一个排列。对稀疏矩阵进行行交换,可以表示为S(p,:)。S(:,p)为列交换形式。对于矩阵S的某一列进行行交换,可以表示为S(p,n),如S(p,1)为对第1列进行交换。【例2-23】 稀疏矩阵S的交换。>> p=[1 3 2 4];>> S=eye(4,4)S = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1>> P=S(p,:)P = 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1>> V=S(p,2)V = 0 0 1 0矩阵P的第1行为S的第1行,第2行为S的第3行,等等。即对矩阵S的行,按照矢量p指定的顺序进行调整。>> S1=speye(4,4)S1 = (1,1) 1 (2,2) 1 (3,3) 1 (4,4) 1>> P1=S1(p,:) % 对于稀疏矩阵行列的交换,返回的形式仍为稀疏矩阵P1 = (1,1) 1 (3,2) 1 (2,3) 1 (4,4) 1对于稀疏矩阵S1进行行列的交换,返回的P1仍为稀疏矩阵。对稀疏矩阵的列重新排序,有时可以使矩阵分解的速度更快,最简单的矩阵排序是根据矩阵中非零元素的个数进行的,这种方法对于元素极不规则的矩阵很有效,特别适用于非零元素在行或列中数目变化较大的矩阵。MATLAB提供有一个非常简单的函数colperm,可以实现这种排序方法。此函数的M文件仅有以下几行:function p=colperm(S)if ~ismatrix(S) % 判断输入变量是否是一个矩阵 error(message(‘MATLAB:colperm:invalidInput’)); % 不满足条件的话返回错误信息end[~,p] = sort(full(sum(S ~= 0, 1)));程序的第5行,实现了以下4个功能。(1)调用S ~= 0判断矩阵中各元素是否为0,若不为0则返回逻辑值1。(2)函数sum求上一步创建的矩阵各列的和,也即为各列中非零元素的个数。(3)函数full将上一步创建的矢量转换为一般矢量的格式。(4)使用函数sort对上一步操作创建的矢量元素进行升序排序,函数sort的第2个输出参数p,即为对矩阵S中各列中非零元素的个数进行重新排序的交换矢量。【例2-24】 对下面的矩阵A,先用函数colperm获取一个交换矢量p,然后根据矢量p对矩阵A的列,按照非零元素的个数升序排序。>> A=[0 1 2 3;3 2 1 0;0 0 2 0;1 0 0 2]A = 0 1 2 3 3 2 1 0 0 0 2 0 1 0 0 2>> p=colperm(A)p = 1 2 4 3>> B=A(:,p)B = 0 1 3 2 3 2 0 1 0 0 0 2 1 0 2 0结果显示,矩阵B就是将A的各列按照非零元素的个数升序排序的结果。7.5 稀疏矩阵视图MATLAB提供有spy函数,用于观察稀疏矩阵非零元素的分布视图。本小节举例来说明spy函数的用法。【例2-25】 稀疏矩阵视图示例。本例采用spy函数绘制Buckminster Fuller网格球顶的60×60邻接矩阵视图。这个矩阵还可用来表示碳60模型和足球。>>B = bucky;>>spy(B)
    在这里插入图片描述
    得到的结果如图2-2所示。图中显示了稀疏矩阵B的非零元素分布视图。

    展开全文
  • matlab 稀疏矩阵

    2014-06-29 09:02:22
    MATLAB矩阵有两种存储方式,完全存储方式和稀疏存储方式 1.完全存储方式  将矩阵的全部元素按列存储,矩阵中的全部零元素也存储到矩阵中。 2.稀疏存储方式  仅存储矩阵所有的非零元素的值及其位置,即行号和列...
    MATLAB的矩阵有两种存储方式,完全存储方式和稀疏存储方式 1.完全存储方式 
    将矩阵的全部元素按列存储,矩阵中的全部零元素也存储到矩阵中。 2.稀疏存储方式 
    仅存储矩阵所有的非零元素的值及其位置,即行号和列号,显然这对于具有大量零元素的稀疏矩阵来说是十分有效的。 设  
       1 0 0 0 A=   0 5 0 0    2 0 0 7  
    是具有稀疏矩阵特征的矩阵,其完全存储方式是按列存储的全部12个元素 1,0,2,0,5,0,0,0,0,0,0,7 其稀疏存储方式如下: 
    (1,1),1,(3,1),2,(2,2),5,(3,4),7 括号内为元素的行列位置,后面为元素值。 
    当矩阵非常的“稀疏”时,会有效的节省存储空间。  
    1.1.2稀疏存储方式的产生  
    1.将完全存储方式转化为稀疏存储方式 
    A=sparse(S);将S矩阵转换为稀疏矩阵A; 
    sparse(m,n);产生m*n的所有元素都为0的稀疏矩阵 
    sparse(u,v,S);S为建立系数矩阵的非零元素,u(i),v(i)分别为S(i)的行和列下标,S,u,v为等长向量。 
    [u,v,S]=find(A);返回矩阵A中非零元素的下标和元素,返回值可以作为sparse(u,v,S);的参数 
    full(A);返回和稀疏存储方式A对应的完全存储方式。 
    例如 
    X=[2,0,0,0,0;0,0,0,0,0;0,0,0,5,0;0,1,0,0,-1;0,0,0,0,-5] A=sparse(X) A= 
        (1,1) 2     (4,2) 1     (3,4) 5     (4,5) -1     (5,5) -5 
    A就是X的稀疏存储方式。  
    2.产生稀疏存储矩阵 
    sparse可以讲完全存储方式转换为稀疏存储方式,那么,当使用稀疏矩阵时,要先产生完全存储方式的矩阵,然后再转换,这显然是不可取的,MATLAB有自己产生稀疏矩阵的函数spconvert: 
    B=spconvert(A);A为一个m*3或m*4的矩阵,A的每一列的意
    义分别为: 
    (i,1)第i非零元素所在行 (i,2)第i非零元素所在列 (i,3)第i非零元素的实部 (i,4)第i非零元素的虚部 
     
     
    3.带状稀疏存储矩阵 
    举个例子: 
      
     
     
    是一个具有稀疏性质的带状矩阵。 


    首先,找出矩阵的特征数据: 
      
     
     
    B为三条对角线元素,d为对角线号,-3为主对角线下第三条,0为主对角线,3为主对角线上第三条。 可以利用spdiags产生稀疏矩阵 A=spdiags(B,d,5,6); 
    也就是spdiags的调用格式 A=spdiags(B,d,m,n); 
    B为r*p阶矩阵,r=min(m,n),p为原带状矩阵中所有非零对角线的条数,B的第i列即为原带状矩阵的第i条非零对角线。 spdiags的其他调用格式: 
    [B.d]=spdiags(A);从原带状矩阵提取全部对角线元素赋给B并把对角线位置赋给d; 
    B=spdiags(A,d);从带状矩阵中提取由d指定的非零对角线元素构成的矩阵; 
    E=spdiags(B,d,A);将A中d指定的对角线元素由B代替构成新矩阵E。 
      
    4.单位矩阵的稀疏矩阵  
    speye(m,n);产生m*n的稀疏存储单位阵。
    展开全文
  • MATLAB基本矩阵操作

    2019-06-26 15:16:52
    矩阵和数组之间的联系:在MATLAB中,矩阵是以数组的形式存在的。因此一维数组相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集。 二:矩阵的构造 矩阵的构架方式有两种,一是与单元数组相似可以对变量直接...
  • MATLAB矩阵

    2018-08-15 15:52:10
    MATLAB中创建矩阵有以下规则: a、矩阵元素必须在”[ ]”内; b、矩阵的同行元素之间用空格(或”,”)隔开; c、矩阵的行与行之间用”;”(或回车符)隔开; d、矩阵的元素可以是数值、变量、表达式或函数; ...
  • MATLAB矩阵与幻方矩阵

    千次阅读 2019-08-15 12:32:28
    MATLAB® 环境中,矩阵是由数字组成的矩形数组。有时,1×1 矩阵(即标量)和只包含一行或一列的矩阵(即向量)会附加特殊含义。MATLAB 采用其他方法来存储数值数据和非数值数据,但刚开始时,通常最好将一切内容...
  • 在用matlab编程进行GNSS粗差提取时,想实现对某矩阵删除指定行(指定列)的命令,下文中描述的均为行。通过百度,先明白对于一行数据而言,删除指定位置的元素的原理。主要思路是先提取要删除的位置,再对该位置数据...
  • Matlab 绘制矩阵色块图

    千次阅读 2019-09-24 11:12:46
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA ...matlab绘制矩阵色块图 本博客摘自天津科技大学谢中华一书, 在R语言中有根据矩阵绘制色块图的程序,可以用于绘制相关系数矩阵图,用丰富的颜色和形状形象的...
  • Matlab矩阵操作

    2021-03-25 20:26:57
    MATLAB中创建矩阵有以下规则: a、矩阵元素必须在”[ ]”内; b、矩阵的同行元素之间用空格(或”,”)隔开; c、矩阵的行与行之间用”;”(或回车符)隔开; d、矩阵的元素可以是数值、变量、表达式或函数; e、...
  • Matlab 矩阵运算

    千次阅读 2014-09-11 10:52:20
    Matlab 矩阵运算 说明:这一段时间用Matlab做了LDPC码的性能仿真,过程中涉及了大量的矩阵运算,本文记录了Matlab矩阵的相关知识,特别的说明了稀疏矩阵和有限域中的矩阵Matlab的运算是在...
  • MATLAB矩阵生成

    万次阅读 多人点赞 2017-01-10 16:23:00
    MATLAB矩阵生成
  • matlab 关于矩阵的用法

    千次阅读 2019-10-09 22:46:12
    矩阵间的大小比较:如A>B //A、B需同维:在矩阵中各元素对应比较大小 若a>b,该处值为1;否则,为0 逻辑运算:与(&)、或( | )、异或(xor)<两者相同则为0,不同则为1 如:xor(A>10,B) 若同个位置,这两矩阵...
  • Matlab 矩阵

    2016-09-11 16:40:20
    MATLAB中创建矩阵有以下规则: a、矩阵元素必须在”[ ]”内; b、矩阵的同行元素之间用空格(或”,”)隔开; c、矩阵的行与行之间用”;”(或回车符)隔开; d、矩阵的元素可以是数值、变量、表达式...
  • MATLAB矩阵增加一维 升维

    万次阅读 2019-03-10 19:35:33
    问题 MATLAB中,如何给矩阵升维? 例如,大小为44的矩阵,如何变为4114(升两维)而避免使用reshape? 解答 data = zeros(4,4); data1(:,1,1,:) = data; disp(size(data1)) ...
  • matlab矩阵的表示与简单操作

    千次阅读 2020-02-11 23:19:36
    matlab矩阵的表示与简单操作 原文地址为:matlab矩阵的表示和简单操作 一、矩阵的表示 在MATLAB中创建矩阵有以下规则: a、矩阵元素必须在”[ ]”内; b、矩阵的同行元素之间用空格(或”,”)隔开; c、矩阵的行...
  • MatlabMATLAB矩阵处理

    千次阅读 2018-06-25 14:24:43
    专题二 MATLAB矩阵处理 -------------------------------------------------------------------------------- 一、特殊矩阵 特殊矩阵包括2大类:通用性的特殊矩阵、用于专门学科的特殊矩阵 1.通用性的特殊矩阵 ...
  • MATLAB矩阵操作

    千次阅读 2018-12-06 09:44:01
    MATLAB矩阵操作大全 一、矩阵的表示 在MATLAB中创建矩阵有以下规则: a、矩阵元素必须在”[ ]”内; b、矩阵的同行元素之间用空格(或”,”)隔开; c、矩阵的行与行之间用”;”(或回车符)隔开; d、矩阵的元素...
  • MATLAB 矩阵运算

    2017-04-27 12:28:07
    生成空矩阵,当对一项操作无结果时,返回空矩阵,空矩阵大小为零。 b = zeros(m, n) 生成一个m行,n列的零矩阵 c = ones(m, n) 生成一个m行,n列的元素全为1的矩阵 d = eye(m, n) 生成一个m行,n列的单位矩阵 ...
  • matlab矩阵和向量的创建

    万次阅读 2018-09-22 14:03:30
    matlab矩阵和向量的创建   1、 向量 的 创建   1)直接输入: 行向量:a=[1,2,3,4,5] 列向量:a=[1;2;3;4;5]   2)用“:”生成向量 a=J:K 生成的行向量是a=[J,J+1,…,K] a=J:D:K 生成...
  • Matlab矩阵函数

    2019-11-11 21:56:29
    矩阵函数 构造矩阵 1.矩阵赋值 a=1:5 %产生1行5列的行向量 a=[1:5]’ %产生5行1列的列向量 a= [ 1 2 3;4 5 6;7 8 9] a =[… 1 2 3 4 5 6 7 8 9] 2.文本中导入数据 如存在文本文件data.txt文件内容如下: ...
  • 使用c++实现Matlab矩阵Matrix类,是今后c++实现Matlab函数功能的基础,保留了Matlab矩阵复制、赋值,加减乘数算数运算,()运算,正负号运算,以及矩阵使用类似Matlab中的生成方式,子矩阵读取,矩阵的扩充,变换等...
  • Matlab矩阵的基本操作

    千次阅读 2013-12-24 23:34:49
    1、生成一个3×3的矩阵A,它的元素为你任意指定的9个不同的正整数,计算A的行列式并将其赋值给变量b,若b0,求出矩阵B=。若b=0,重新选择A。 将所生成的矩阵A及B连在一起,构成一个3×6的矩阵,并付给变量C,在...
  • 文章目录语法输入参数A - 第一个输入B - 第二个输入A1,A2,…,An - 输入列表说明实例两...第一个输入,指定为标量、向量、矩阵、多维数组、表或时间表。 B - 第二个输入 标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表 第

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,629
精华内容 3,851
关键字:

matlab指定矩阵大小

matlab 订阅