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
- 数学中的$\dfrac{w_i}{w_j}$ , 对应的是
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,