matlab 问题集合基础

1、inputname获取函数参数名字,返回一个字符串

2、 输入可变长参数,以及输出可变长参数

3、 nargin 捕获输入参数的个数, nargout 捕获输出参数的个数.

function varargout = foo(varargin)
%输入可变长参数,以及输出可变长参数,都是放在一个细胞中存储, 
%而inputname 存变量名的方式,用的是字符数组矩阵的形式
if nargin == 2
  varargout{1} = a1; varargout{2} = a2;
else nargin == 3
  varargout{1} = a1; varargout{2} = a2; varargout{3} = a3;
end


function varargout = combin_index(varargin)
variable_name = cell(1,nargin); % 创建一个 1* nargin 大小的 cell,
for i = 1:nargin
    T = f(varargin{i});  % 获取的新参数 传递给另一个函数
    variable_name{i} = inputname(i); % 由于变量名是字符,所以用细胞来存储
end
% variable_name 这个 cell 存储了变量名

4、 table 类型的变量如何进行转置,对于表格,您可以使用’table2cell’和’cell2table’的组合:

Xc = table2cell(X) % 这里 X 为要转置的表,Xt 为转置后的表
Xt = cell2table(Xc','RowNames',X.Properties.VariableNames,'VariableNames',X.Properties.RowNames)

如果用的是 matlab2018 可以使用rows2vars函数,参考https://www.mathworks.com/help/matlab/ref/rows2vars.html

5、 matlab字符串以及 cell 之间 的操作可以看薛山的 MATLAB 基础教程

6、 区分repmat 以及repelem ,

  • repmat 把复制的对象看做一个整体
  • repelem 复制对象中的元素,最终结果不改变原对象的数据类型

7、MATLAB 中 矩阵 点除 一个向量的问题(./),

点除保证矩阵维度和向量长度相同,且 w为行向量,A为方阵,A 可以不是方阵,

MATLAB:

  • A ./ w w 为行向量时, 结果是把矩阵 A 的每一列对应的行向量元素相除
  • A ./ w' w’ 为列向量时, 结果是把矩阵 A 的每一行对应的列向量元素相除

R : 由于 R 中默认把向量都变为行向量, 所以想对列操作需要进行转变

  • A / w w 为行向量时, 结果是把矩阵 A 的每一列对应的行向量元素相除
  • t(t(A)/w) 其中w为行向量时, 结果是把矩阵 A 的每一行对应的行向量元素相除

    %% 实例
    >> A1 = magic(3)
    A1 =
     8     1     6
     3     5     7
     4     9     2
    >> d = [1:3]
    d =
     1     2     3
    >> A1 ./ d
    ans =
    8.0000    0.5000    2.0000
    3.0000    2.5000    2.3333
    4.0000    4.5000    0.6667
    >> A1 ./ d'
    ans =
    8.0000    1.0000    6.0000
    1.5000    2.5000    3.5000
    1.3333    3.0000    0.6667
    %% 于是可以进行 按列单位化 :  A5 ./ sqrt(sum(A5.^2,1))
    %%  按行单位化: A5 ./ sqrt(sum(A5.^2,2))
    
    # R 中, 矩阵除以向量  直接是矩阵行除向量对应的元素. 
    > A = matlab::magic(3)
    > A
     [,1] [,2] [,3]
    [1,]    8    1    6
    [2,]    3    5    7
    [3,]    4    9    2
    > d = c(1:3)
    > A / d
         [,1] [,2]      [,3]
    [1,] 8.000000  1.0 6.0000000
    [2,] 1.500000  2.5 3.5000000
    [3,] 1.333333  3.0 0.6666667
    > t(t(A)/d)  # 类似 MATLAB 矩阵列除以向量对应的元素
     [,1] [,2]      [,3]
    [1,]    8  0.5 2.0000000
    [2,]    3  2.5 2.3333333
    [3,]    4  4.5 0.6666667
    
    ## 还可以利用 sweep 函数,-- 
    #矩阵的某个方向(列或行) 对一个向量中的元素进行一一对应运算
    > sweep(A, 1, d, FUN = '/')   # 1 代表对矩阵行方向进行运算,等价于: A / d
         [,1] [,2]      [,3]
    [1,] 8.000000  1.0 6.0000000
    [2,] 1.500000  2.5 3.5000000
    [3,] 1.333333  3.0 0.6666667
    > sweep(A, 2, d, FUN = '/')  # 2 代表对矩阵列方向进行运算,等价于: t(t(A)/d)
     [,1] [,2]      [,3]
    [1,]    8  0.5 2.0000000
    [2,]    3  2.5 2.3333333
    [3,]    4  4.5 0.6666667
    
    
    

sweep(x, MARGIN, STATS, FUN="-", ...)对矩阵进行运算。MARGIN为1,表示行的方向上进行运算,为2表示列的方向上运算。STATS是运算的参数。FUN为运算函数,默认是减法。下面利用sweep对矩阵x进行极差标准化变换。

注意:

  • R 中 1 代表对行方向上进行运算, 2 代表对列的方向上进行运算,
  • MATLAB 中 1 代表对列方向上进行计算, 2 代表对行方向上进行计算

8 、矩阵对向量运算的理解

由于 R 中不存在列向量与行向量, 其实 R 中的向量在内存中都是以列的方式存储,所以 R 中的向量全是列向量, 这就可以和 MATLAB 的运算对应起来, 于是 MATLAB 和 R 的矩阵对向量运算可以解释为一下情况, 假设 A 代表矩阵,d 代表向量,&代表运算规则

A & d

1, 列向量d自动扩充复制成一个大小和矩阵A 一模一样的矩阵,然后再按照矩阵点除(这里这的是矩阵对应位置元素做运算)的方法进行运算(即列向量按照行进行扩充)

d = c(1:3) #列向量按照行进行扩充复制
[1 1 1
 2 2 2 
 3 3 3]

d = [1,2,3] # 行向量按照列进行扩充
[1 2 3
 1 2 3
 1 2 3]

2 由于 MATLAB 支持行向量,所以 行向量是按照列的方式进行复制扩充的. 然后在进行矩阵运算(行向量按照列进行扩充)

9 、两个向量之间的点除./ ,

  • 行向量点除列向量 , 行作为分子,列作为分母,交叉构建成一个矩阵
  • 列向量点除行向量,列作为分子, 行作为分母,交叉构建成一个矩阵
  • 若$w = (w_1,w_2,\dots,w_n)$是一个向量,

    • 数学中的$\dfrac{w_i}{w_j}$ , 对应的是 w ./ w'矩阵中的第j,i 元素
    • 数学中的$\dfrac{w_j}{w_i}$ , 对应的是 w ./ w'矩阵中的第i,j 元素, 分母的索引在前面
    • matlab中log(A).^2 等价(log(A)).^2

      >> format rat
      w1 = [1,3,5];
      >> w2 = [7,9,11];
      >> w1 ./ w2'
      ans =
      1/7            3/7            5/7     
      1/9            1/3            5/9     
      1/11           3/11           5/11    
      >> w1' ./ w2
      ans =
      1/7            1/9            1/11    
      3/7            1/3            3/11    
      5/7            5/9            5/11  
      

10、 sum, prod,mean ,… 涉及维度的函数,这和 R 中不一样,默认都是对列进行操作

  • R 中 一般是 1 代表对行进行操作,apply(A,1,sum)
  • MATLAB 一般 1 代表是对列进行操作. sum(A,1)

    % matlab
    >> A2 = [1,1/5,1/3,1/9;
      5,1,4,1/8;
      3,1/4,1,1/9;
      9,8,9,1];
    >> sum(A2,1)
    ans =
    18.0000    9.4500   14.3333    1.3472
    >> sum(A2,2)
    ans =
    1.6444
    10.1250
    4.3611
    27.0000
    >> sum(A2)
    ans =
    18.0000    9.4500   14.3333    1.3472
    
    #  R语言
    > A = matrix(c(1,1/5,1/3,1/9,
    +       5,1,4,1/8,
    +       3,1/4,1,1/9,
    +       9,8,9,1),ncol =4,nrow =4,byrow = T)
    > 
    > apply(A,1, sum)
    [1]  1.644444 10.125000  4.361111 27.000000
    > apply(A,2, sum)
    [1] 18.000000  9.450000 14.333333  1.347222
    > 
    

11、 matlab归一化问题

均值-方差归一化

%自带函数 -- MATLAB 默认的方差是 n-1 的
zscore(A1)
mapstd(A1)
% 矩阵方法 -- 其中 std(A1,0,1) : 0 方差是 n-1,
(A1 - mean(A1,1) ) ./ std(A1,0,1)

% 循环方法
 n = size(A1,1)
 B = zeros(size(A1))
 for i = 1:n
     B(:,i) =( A1(:,i) - mean(A1(:,i)) ) ./ std(A1(:,i),0,1);
 end
 B

Max-min 均值化

mapminmax

12、 —统计重复出现的此次,即频率

tabulate

13、 Matlab 保存图片问题

保存图片 saveas 图片丢失颜色 —加参数 epsc 即可

saveas(gca,'Density.eps','epsc')

saveas 指定目录保存

saveas(gcf,['D://give/your/path/here/',''filename',bmp);

14、matlab 对缺失值 nan 的处理

R = rmmissing(A) 从数组或表中删除缺失的条目

rmmissing(B,1) % nan 所在的行被删除,返回剩余完整的行 (默认)
rmmissing(B,2) % nan 所在的列被删除,返回剩余完整的列
B(all(~isnan(B), 2),:)   %同理删除矩阵中缺失的条目
% 其中 all(A,2) 的意思是如果A的某行没有非零值,那么该行返回值为1,

次;