草庐IT

MATLAB | 好看的相关系数矩阵图绘制

slandarer 2023-06-05 原文

又是一个长长的工具类函数,创作编写不易,如果有用的话点赞,转发走起~

绘制超好看的相关系数矩阵图!工具函数由于过长将放在最后展示,以下先展示使用方式和绘制效果:

使用效果


使用教程

0 数据准备

数据就多列的数值矩阵即可:

X=[-2.8461   -0.9470   -0.1491   -1.6213   -1.1106    0.6428    2.7456   -1.0897
   -0.7024   -0.1509   -1.9612   -0.9706    1.0950    0.3940    1.6108    0.6323
    0.3761   -1.1815   -0.3485   -1.2662   -0.8673   -1.6869   -0.8052    1.4172
    0.1717    0.0230   -0.1417   -0.0084   -1.2139   -0.6537    0.1804    0.5806
   -1.5339    0.0020   -2.4430   -0.5684    0.0198   -0.2628   -0.0488    1.3821
   -0.6906    0.6501   -0.2527    0.1571    0.7983    2.0210   -0.5023   -0.3868
    0.7227    0.4469    1.1316    0.2165    1.9895   -0.9230    0.2779    0.1402
   -1.1487   -0.1272    0.0974    0.7397   -1.1794    1.4483    0.5348    0.9840
    2.4263    0.3561   -0.5850   -0.0829    0.9081    0.6718    3.1348   -1.6806
    1.4553   -0.7559    1.3223   -0.1616    1.6948   -0.0941    0.2619    0.0846
    1.1833    2.0956   -0.4242   -1.1503    0.4986   -0.7468   -1.1212   -1.4685
    1.2845   -0.3788   -0.2780    3.2273    0.2187   -1.7527   -0.5731    0.8619
    0.9713    0.3849    0.4713    1.3746    1.3742   -0.0587    0.5780   -0.0382
    1.4192    0.4118    1.0904    0.6697    1.1387   -1.4548   -1.4595   -0.6207
   -0.1758   -0.0541    3.3090    0.4501    1.5922   -2.0072   -0.5666   -1.0384
    3.1798    1.2233    2.1071    0.3412    0.6792   -0.4604    0.3374   -0.6348
    2.6781    0.9919    2.2081    2.3743    1.0871    0.2585   -0.6621    0.1306
    1.6062    3.3028    2.5823    2.1885    2.4703   -1.1143    0.1006    1.9326
   -0.0094    2.4318    3.1476    1.9018    2.9599   -0.2546   -1.3590   -2.0736
    2.0687    1.5410    1.1177    2.2240    2.3615   -0.5323   -1.0246   -0.2873];

为了减少之后代码的篇幅,已将此矩阵存入XData.mat文件,后文使用如下方式导入数据:

load XData.mat

1 基本使用

对,就两行!

load XData.mat

CMP=corrMatPlot(X);
CMP=CMP.draw();

2 修改标签

理论上方法有三种,以下三种方式等价(推荐第二种):

load XData.mat

CMP=corrMatPlot(X,'Labels',{'welcome','to','follow','my','wechat','official','account','slandarer'});
CMP=CMP.draw();
load XData.mat

CMP=corrMatPlot(X);
CMP=CMP.setLabelStr({'welcome','to','follow','my','wechat','official','account','slandarer'});
CMP=CMP.draw();
load XData.mat

CMP=corrMatPlot(X);
CMP=CMP.draw();
CMP.setLabelStr({'welcome','to','follow','my','wechat','official','account','slandarer'});

3 修改colormap

上面三种修改方式依旧适用,但为了节省篇幅只介绍最推荐的一种,同时此方法接受三种格式数据,使用setColorMap函数修改配色:

3.1 matlab自带colormap

matlab 自带的colormap均可用:

load XData.mat

CMP=corrMatPlot(X);
CMP=CMP.setColorMap(copper);
CMP=CMP.draw();

copper:

pink:

summer:

3.2 mx3大小RGB数组

load XData.mat

CMP=corrMatPlot(X);
cList=[114,146,184;255,255,255;132,158,119]./255;
CMP=CMP.setColorMap(cList);
CMP=CMP.draw();

3.3 内置colormap

本工具函数类内内置了6种colormap,可以通过:

  • obj.setColorMap(n)

的格式使用:

load XData.mat

CMP=corrMatPlot(X);
CMP=CMP.setColorMap(2);
CMP=CMP.draw();

内置配色1:

内置配色2:

内置配色3:

内置配色4:

内置配色5:

内置配色6:

4 上下三角模式

设置类的Format属性即可:

  • full 完整矩阵图
  • triu 上三角矩阵图
  • tril 下三角矩阵图
load XData.mat

CMP=corrMatPlot(X,'Format','tril');
CMP=CMP.setColorMap(1);
CMP=CMP.draw();

5 系数展示格式

通过调整Type属性调整格式:

  • sq : 方形(默认)
  • ssq : 含文本方形
  • pie : 饼图
  • circ : 圆形
  • oval : 椭圆形
load XData.mat

CMP=corrMatPlot(X,'Type','pie');
CMP=CMP.setColorMap(1);
CMP=CMP.draw();

全部格式展示(上三角)

sq:

ssq:

pie:

circ:

oval:

6 标签格式修改

使用:

  • setXLabel
  • setYLabel

函数分别修饰X轴Y轴标签,text对象具有的属性均可被修饰,以下展示修饰字体,字号及颜色:

load XData.mat

CMP=corrMatPlot(X,'Format','triu','Type','pie');
CMP=CMP.setColorMap(1);
CMP=CMP.draw(); 
CMP.setXLabel('Color',[.8,0,0],'FontName','Cambria','FontSize',15)
CMP.setYLabel('Color',[0,0,.8],'FontName','Cambria','FontSize',15)

7 框格式修改

使用setBox函数修饰框样式,Line对象具有的属性均可被修饰,以下展示加粗并更改颜色:

load XData.mat

CMP=corrMatPlot(X,'Format','triu','Type','pie');
CMP=CMP.setColorMap(1);
CMP=CMP.draw(); 
CMP.setBox('LineWidth',2,'Color',[.8,0,0])

7 内容物修饰

使用setPatch修改内容物格式,Patch对象具有的属性均可被修饰,以下展示加粗边缘,修改边缘颜色:

load XData.mat

CMP=corrMatPlot(X,'Format','triu','Type','pie');
CMP=CMP.setColorMap(1);
CMP=CMP.draw();
CMP.setPatch('LineWidth',2,'EdgeColor',[0,0,.8])

7 数值标签修饰

使用setCorrTxt函数进行修饰,仅ssq格式的图像可修饰:

load XData.mat

CMP=corrMatPlot(X,'Format','triu','Type','ssq');
CMP=CMP.setColorMap(1);
CMP=CMP.draw();
CMP.setCorrTxt('Color',[0,0,.8],'FontName','Cambria','FontSize',12)


工具函数完整代码

classdef corrMatPlot
% @author : slandarer
% gzh  : slandarer随笔

% 使用示例:
% =========================================================================
% X=[-2.8461   -0.9470   -0.1491   -1.6213   -1.1106    0.6428    2.7456   -1.0897
%    -0.7024   -0.1509   -1.9612   -0.9706    1.0950    0.3940    1.6108    0.6323
%     0.3761   -1.1815   -0.3485   -1.2662   -0.8673   -1.6869   -0.8052    1.4172
%     0.1717    0.0230   -0.1417   -0.0084   -1.2139   -0.6537    0.1804    0.5806
%    -1.5339    0.0020   -2.4430   -0.5684    0.0198   -0.2628   -0.0488    1.3821
%    -0.6906    0.6501   -0.2527    0.1571    0.7983    2.0210   -0.5023   -0.3868
%     0.7227    0.4469    1.1316    0.2165    1.9895   -0.9230    0.2779    0.1402
%    -1.1487   -0.1272    0.0974    0.7397   -1.1794    1.4483    0.5348    0.9840
%     2.4263    0.3561   -0.5850   -0.0829    0.9081    0.6718    3.1348   -1.6806
%     1.4553   -0.7559    1.3223   -0.1616    1.6948   -0.0941    0.2619    0.0846
%     1.1833    2.0956   -0.4242   -1.1503    0.4986   -0.7468   -1.1212   -1.4685
%     1.2845   -0.3788   -0.2780    3.2273    0.2187   -1.7527   -0.5731    0.8619
%     0.9713    0.3849    0.4713    1.3746    1.3742   -0.0587    0.5780   -0.0382
%     1.4192    0.4118    1.0904    0.6697    1.1387   -1.4548   -1.4595   -0.6207
%    -0.1758   -0.0541    3.3090    0.4501    1.5922   -2.0072   -0.5666   -1.0384
%     3.1798    1.2233    2.1071    0.3412    0.6792   -0.4604    0.3374   -0.6348
%     2.6781    0.9919    2.2081    2.3743    1.0871    0.2585   -0.6621    0.1306
%     1.6062    3.3028    2.5823    2.1885    2.4703   -1.1143    0.1006    1.9326
%    -0.0094    2.4318    3.1476    1.9018    2.9599   -0.2546   -1.3590   -2.0736
%     2.0687    1.5410    1.1177    2.2240    2.3615   -0.5323   -1.0246   -0.2873];
% 
% CMP=corrMatPlot(X,'Format','triu','Type','pie');
% CMP=CMP.setColorMap(1);
% CMP=CMP.draw();
% CMP.setLabelStr({'welcome','to','follow','my','wechat','official','account','slandarer'})

    properties
        ax;drawn=false;
        arginList={'Labels','colorMap','Format','Type'}
        Labels={};
        colorMap={};
        baseCM={[189, 53, 70;255,255,255; 97, 97, 97]./255,...
                [113,161,195;255,255,255;228,103, 38]./255,...
                [ 28,127,119;255,255,255;204,157, 80]./255,...
                [130,130,255;255,255,255;255,133,133]./255,...
                [209,58,78;253,203,121;254,254,189;198,230,156;63,150,181]./255,...
                [243,166, 72;255,255,255;133,121,176]./255};
        Format='full'% full:完整矩阵 triu:上三角 tril:下三角
        Type='sq'    % sq   : 方形(默认)
                     % ssq  : 含文本方形
                     % pie  : 饼图
                     % circ : 圆形
                     % oval : 椭圆形
        XData;num;corrMat;
        % -----------------------------------------------------------------
        boxHdl;txtHdl;
        RLabelHdl;CLabelHdl;
        colorbarHdl
        matrixHdl
    end

    methods
        function obj=corrMatPlot(varargin)
            if isa(varargin{1},'matlab.graphics.axis.Axes')
                obj.ax=varargin{1};varargin(1)=[];
            else
                obj.ax=gca;
            end
            % 获取版本信息
            tver=version('-release');
            verMatlab=str2double(tver(1:4))+(abs(tver(5))-abs('a'))/2;
            if verMatlab<2017
                hold on
            else
                hold(obj.ax,'on')
            end
            % -------------------------------------------------------------
            obj.colorMap=obj.baseCM{1};
            obj.XData=varargin{1};varargin(1)=[];
            obj.corrMat=corr(obj.XData);
            obj.num=size(obj.corrMat,1);
            % 获取其他信息
            for i=1:(length(varargin)-1)
                tid=ismember(obj.arginList,varargin{i});
                if any(tid)
                obj.(obj.arginList{tid})=varargin{i+1};
                end
            end
            if isempty(obj.Labels)
                for i=1:obj.num
                    obj.Labels{i}=['class ',num2str(i)];
                end
            end
            help corrMatPlot
        end
% =========================================================================
        function obj=draw(obj)
            obj.ax.XLim=[.5,obj.num+.8];
            obj.ax.YLim=[.5,obj.num+.5];
            obj.ax.XTick=[];
            obj.ax.YTick=[];
            obj.ax.XColor='none';
            obj.ax.YColor='none';
            obj.ax.PlotBoxAspectRatio=[1,1,1];
            % 绘制boxHdl
            if strcmp(obj.Type(end-1:end),'sq');vb0='off';else,vb0='on';end
            switch obj.Format
                case 'full'
                    bX=[repmat([.5,obj.num+.5],[obj.num+1,1]),ones([obj.num+1,1]).*nan];
                    bY=[repmat((.5:1:obj.num+.5)',[1,2]),ones([obj.num+1,1]).*nan];
                    bXX=[bX;bY]';bYY=[bY;bX]';bXX=bXX(:);bYY=bYY(:);
                    obj.boxHdl=plot(bXX,bYY,'LineWidth',.8,'Color',[1,1,1].*.85,'Visible',vb0);
                case 'tril'
                    bX=[.5.*ones([obj.num+1,1]),(0:obj.num)'+1.5,ones([obj.num+1,1]).*nan];
                    bX(end,2)=bX(end,2)-1;
                    bY=[repmat((obj.num+.5:-1:.5)',[1,2]),ones([obj.num+1,1]).*nan];
                    bXX=[bX;bY]';bYY=[bY;bX]';bXX=bXX(:);bYY=bYY(:);
                    obj.boxHdl=plot(bXX,bYY,'LineWidth',.8,'Color',[1,1,1].*.85,'Visible',vb0);
                case 'triu'
                    bX=[(obj.num+.5).*ones([obj.num+1,1]),(obj.num:-1:0)'-.5,ones([obj.num+1,1]).*nan];
                    bX(end,2)=bX(end,2)+1;
                    bY=[repmat((.5:1:obj.num+.5)',[1,2]),ones([obj.num+1,1]).*nan];
                    bXX=[bX;bY]';bYY=[bY;bX]';bXX=bXX(:);bYY=bYY(:);
                    obj.boxHdl=plot(bXX,bYY,'LineWidth',.8,'Color',[1,1,1].*.85,'Visible',vb0);
            end

            colorFunc=colorFuncFactory(obj.colorMap);
            colormap(colorFunc(linspace(-1,1,100)));caxis([-1,1])
            cb=colorbar();
            % 绘制colorbar
            cb.Limits=[-1.02,1.02];
            cb.TickDirection='out';
            cb.LineWidth=.8;
            cb.Ticks=-1:.2:1;
            cb.FontName='Arial';
            cb.FontSize=11;
            obj.colorbarHdl=cb;

            for row=1:obj.num
                for col=1:obj.num  
                    tValue=obj.corrMat(row,col);
                    tColor=colorFunc(tValue);
                    tGray=1-rgb2gray(tColor);
                    baseT=linspace(0,2*pi,500);
                    thetaMat=[1,-1;1,1].*sqrt(2)./2;

                    vb1='on';
                    if strcmp(obj.Format,'triu')&&row>col,vb1='off';end
                    if strcmp(obj.Format,'tril')&&row<col,vb1='off';end
                    switch obj.Type
                        case 'sq'   % 方形
                            baseSqX=[-.5,.5,.5,-.5].*0.95;
                            baseSqY=[-.5,-.5,.5,.5].*0.95;
                            obj.matrixHdl(row,col).f=fill(baseSqX+col,baseSqY+1+obj.num-row,...
                                tColor,'EdgeColor','none','Visible',vb1);
                        case 'ssq'   % 含文本方形
                            baseSqX=[-.5,.5,.5,-.5].*0.95;
                            baseSqY=[-.5,-.5,.5,.5].*0.95;
                            obj.matrixHdl(row,col).f=fill(baseSqX+col,baseSqY+1+obj.num-row,...
                                tColor,'EdgeColor','none','Visible',vb1);
                            obj.matrixHdl(row,col).t=text(col,1+obj.num-row,...
                                sprintf('%.2f',obj.corrMat(row,col)),'FontName','Arial','FontSize',10,...
                                'HorizontalAlignment','center','Color',tGray,'Visible',vb1);
                        case 'pie'  % 饼图
                            baseCircX=cos(baseT).*.92.*.5;
                            baseCircY=sin(baseT).*.92.*.5;
                            obj.matrixHdl(row,col).c=fill(baseCircX+col,baseCircY+1+obj.num-row,...
                                [1,1,1],'EdgeColor',[1,1,1].*.3,'LineWidth',.8,'Visible',vb1);
                            baseTheta=linspace(pi/2,pi/2+tValue.*2.*pi,200);
                            basePieX=[0,cos(baseTheta).*.92.*.5];
                            basePieY=[0,sin(baseTheta).*.92.*.5];
                            obj.matrixHdl(row,col).f=fill(basePieX+col,basePieY+1+obj.num-row,...
                                tColor,'EdgeColor',[1,1,1].*.3,'lineWidth',.8,'Visible',vb1);
                        case 'circ' % 圆形   
                            baseR=(.25+.6.*abs(tValue)).*.5;
                            baseCircX=cos(baseT).*baseR;
                            baseCircY=sin(baseT).*baseR;
                            obj.matrixHdl(row,col).f=fill(baseCircX+col,baseCircY+1+obj.num-row,...
                                tColor,'EdgeColor','none','Visible',vb1);
                        case 'oval' % 椭圆形
                            baseA=1+(tValue<=0).*tValue;
                            baseB=1-(tValue>=0).*tValue;
                            baseOvalX=cos(baseT).*.98.*.5.*baseA;
                            baseOvalY=sin(baseT).*.98.*.5.*baseB;
                            baseOvalXY=thetaMat*[baseOvalX;baseOvalY];
                            obj.matrixHdl(row,col).f=fill(baseOvalXY(1,:)+col,baseOvalXY(2,:)+1+obj.num-row,...
                                tColor,'EdgeColor',[1,1,1].*.3,'lineWidth',.8,'Visible',vb1);
                    end
                    
                end
            end

            tfig=obj.ax.Parent;
            tfig.Position(2)=tfig.Position(2)./2;
            tfig.Position(4)=tfig.Position(3);
            tfig.Color=[1,1,1];

            for row=1:obj.num
                obj.RLabelHdl(row)=text(.42+(row-1).*strcmp(obj.Format,'triu'),obj.num+1-row,...
                    obj.Labels{row},'HorizontalAlignment','right',...
                    'FontName','Arial','FontSize',12);
            end
            for col=1:obj.num
                obj.CLabelHdl(col)=text(col-.1,obj.num+.75-(col-1).*strcmp(obj.Format,'tril'),...
                    obj.Labels{col},'HorizontalAlignment','left',...
                    'FontName','Arial','FontSize',12,'Rotation',30);
            end
            obj.drawn=true;

            % -------------------------------------------------------------
            % 渐变色句柄生成函数
            function colorFunc=colorFuncFactory(colorList)
                x=linspace(-1,1,size(colorList,1));
                y1=colorList(:,1);y2=colorList(:,2);y3=colorList(:,3);
                colorFunc=@(X)[interp1(x,y1,X,'linear')',...
                    interp1(x,y2,X,'linear')',interp1(x,y3,X,'linear')'];
            end
        end
% =========================================================================
        % 预设/设置colormap
        function obj=setColorMap(obj,CM)
            if length(CM)==1
                obj.colorMap=obj.baseCM{CM};
            else
                obj.colorMap=CM;
            end

            if obj.drawn
                colorFunc=colorFuncFactory(obj.colorMap);
                colormap(colorFunc(linspace(-1,1,100)));
                for row=1:obj.num
                for col=1:obj.num  
                    tValue=obj.corrMat(row,col);
                    tColor=colorFunc(tValue);
                    tGray=1-rgb2gray(tColor);
                    set(obj.matrixHdl(row,col).f,'FaceColor',tColor);
                    if strcmp(obj.Type,'ssq')
                        set(obj.matrixHdl(row,col).t,'Color',tGray)
                    end
                end
                end
            end

            % -------------------------------------------------------------
            % 渐变色句柄生成函数
            function colorFunc=colorFuncFactory(colorList)
                x=linspace(-1,1,size(colorList,1));
                y1=colorList(:,1);y2=colorList(:,2);y3=colorList(:,3);
                colorFunc=@(X)[interp1(x,y1,X,'linear')',...
                    interp1(x,y2,X,'linear')',interp1(x,y3,X,'linear')'];
            end
        end
        % XY轴标签设置
        function obj=setLabelStr(obj,LB)
            obj.Labels=LB;
            if obj.drawn
                for i=1:obj.num
                    set(obj.RLabelHdl(i),'String',obj.Labels{i});
                    set(obj.CLabelHdl(i),'String',obj.Labels{i});
                end
            end
        end

        function obj=setXLabel(obj,varargin)
            for i=1:obj.num
                set(obj.CLabelHdl(i),varargin{:})
            end
        end
        function obj=setYLabel(obj,varargin)
            for i=1:obj.num
                set(obj.RLabelHdl(i),varargin{:})
            end
        end
        % patch对象设置
        function obj=setPatch(obj,varargin)
            for row=1:obj.num
                for col=1:obj.num 
                    set(obj.matrixHdl(row,col).f,varargin{:});
                    if strcmp(obj.Type,'pie')
                        set(obj.matrixHdl(row,col).c,varargin{:},'FaceColor',[1,1,1])
                    end
                end
            end
        end
        % 设置数值文本
        function obj=setCorrTxt(obj,varargin)
            if strcmp(obj.Type,'ssq')
                for row=1:obj.num
                for col=1:obj.num  
                    set(obj.matrixHdl(row,col).t,varargin{:})
                end
                end
            end
        end       
        % 设置框样式
        function obj=setBox(obj,varargin)
            set(obj.boxHdl,varargin{:},'Visible','on')
        end
    end
% @author : slandarer
% gzh  : slandarer随笔
end

另:试了一下更多组数据绘图,效果还行:

未经允许本代码请勿作商业用途,引用的话可以引用我file exchange上的链接,可使用如下格式:

Zhaoxu Liu (2022). corr plot 相关系数矩阵图 (https://www.mathworks.com/matlabcentral/fileexchange/117100-corr-plot), MATLAB Central File Exchange. 检索来源 2022/9/3.

若转载请保留以上file exchange链接及本文链接!!!

以上已经为全部代码,但懒得复制的话:

【相关系数矩阵图】

更新时会跟进更新以下连接:

【链接】:https://pan.baidu.com/s/1URle1b3dwdsE-9gtj5Ru-g?pwd=slan

【提取码】:slan

有关MATLAB | 好看的相关系数矩阵图绘制的更多相关文章

  1. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  2. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  3. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  6. ruby - 使用指向 ruby​​ 可执行文件的符号链接(symbolic link)时查找相关库 - 2

    假设您有一个可执行文件foo.rb,其库bar.rb的布局如下:/bin/foo.rb/lib/bar.rb在foo.rb的header中放置以下要求以在bar.rb中引入功能:requireFile.dirname(__FILE__)+"../lib/bar.rb"只要对foo.rb的所有调用都是直接的,这就可以正常工作。如果你把$HOME/project和符号链接(symboliclink)foo.rb放入$HOME/usr/bin,然后__FILE__解析为$HOME/usr/bin/foo.rb,因此无法找到bar.rb关于foo.rb的目录名.我意识到像ruby​​gems这

  7. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  8. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  9. HarmonyOS原子化服务开发相关术语 - 2

    术语中文解释Ability原子化服务帮助用户完成任务的原子化服务,和用户的意图进行关联。Fulfillment服务履行通过图标,卡片,语音等形式呈现用户意图。开发者通过接口的方式,处理用户意图,返回内容。Intent意图用于表达用户想要达成的目标或完成的任务。HUAWEIAssistant智能助手“无微不智”的个人助手,通过不断的学习用户的使用习惯,不断的为用户提供贴心的精准的便捷的个性化服务。AISearch全局搜索用户可快速搜索关键词,与之匹配的原子化服务则会出现在搜索结果中。SmartService智慧服务用户订阅原子化服务,在到达特定触发条件(时间、地点、事件)后,卡片推送至用户智能助

  10. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

随机推荐