关于Matlab一串代码的解释

img


把前几行代码解释一下
后面的代码解释的更详细一点
如ndgrid A{:} A{1,i} = A{1,i}(:);
repmat p相关的内容等

function [S, R]= nacissistic(base, n)
A = cell(1,n);
[A{:}] = ndgrid(0:base-1);
for i = 1:n
A{1,i} = A{1,i}(:);
end
A = cell2mat(A);%所有可能的n位base进制数
A(A(:,1)==0,:) = [];%去除最高位为0的数
B = sum(A.^n,2);%每个数的位置依次n次方相加,表示成十进制
N = repmat(n-1:-1:0,size(A,1),1);% 幂指标
C = sum(A.*base.^N,2);%每个n位base进制数表示成十进制
p = B==C;
S = C(p,1); % 这个是10进制下的结果
R = A(p,:); % 这个是base进制的行向量,每一行代表一个数,列代表位数
end


A = cell(1,n);
[A{:}] = ndgrid(0:base-1);
for i = 1:n
A{1,i} = A{1,i}(:);
end

这一段是枚举所有n位数的情况。比如当n=3时,最后A变成3列数字,每一行是百位,十位,个位 。
A = cell(1,n); 产生一个1行n列的元胞数组,每个列,负责一个十进制(或n进制)里的位,
[A{:}] = ndgrid(0:base-1); ndgrid 是meshgrid的高级版,根据A有几列元胞数组,产生几维的矩阵。3维可以想象一个魔方。等于3时,是把一向量,先变二维方阵,再重复几片方阵,变成n维向量魔方。如果输入10,就是0到9 这10个数产生3个方向排列的立体三维矩阵。4维时,变成n维魔方后每个点元素其实是二维方阵,这个空间想象不出样子。。。。

感觉实际上就是为了枚举出N位数字的所有组合,并分到n列上。个位就是0,1,2.。。。。十位就是0,0,0.。。(10个0),1,1,1,1。。。(10个1),2,2,2,。。。。 上边这一套变换途中产生了n维的整列,不好想象。
A(A(:,1)==0,:) = []; 把百位那列是0的都给去掉了
B 是各个位n次方的和
repmat(A,m,n) 是把A矩阵,当成一个元素,重复列举m行,n列组成一个新的矩阵
repmat(n-1:-1:0,size(A,1),1); 里 n-1:-1:0 是各个位下降,拿10进制来说 个位是一个一位数乘以10的0次方,十位是一个一位数乘以10的1次方。。。。
所以 n-1:-1:0是 n进制里 各个位上的 那个一位数 需要乘的数,加起来就是这个数 。 比如23,就是 2乘以10的1次方 加上 3乘以10的0次方。再比如16进制
A3 就是 A乘以16的1次方,加上3乘以16的0次方。base.^N,就把他们需要乘的数,列出来了。
p = B==C;是个逻辑筛选条件
A(p,:);就是说 对行进行筛选,p逻辑矩阵里头是1的行, A中对应的行会被提取出来,p逻辑矩阵里头是0的行,A对应的都去掉了。
S是数字列, R是数字按百,十,个位分了列的矩阵