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
一模一样的矩阵,然后再按照矩阵点除(这里这的是矩阵对应位置元素做运算)
的方法进行运算(即列向量按照行进行扩充)
= c(1:3) #列向量按照行进行扩充复制
d 1 1 1
[2 2 2
3 3 3]
= [1,2,3] # 行向量按照列进行扩充
d 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
- 数学中的\(\dfrac{w_i}{w_j}\) , 对应的是
>> 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,