m0_61684943 2021-10-21 08:28 采纳率: 73.8%
浏览 20
已结题

关于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

  • 写回答

1条回答 默认 最新

  • 胸毛男 2021-10-21 09:30
    关注
    
    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是数字按百,十,个位分了列的矩阵

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址