You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pari/GP中编写n顶点路径图Pₙ的邻接矩阵通用代码?

解决Pari/GP中路径图邻接矩阵通用函数的问题

我完全懂你遇到的困扰——特定顶点数的邻接矩阵代码跑起来没问题,但改成通用函数就触发了语法错误,核心原因是你在函数里错误地用递归调用自身的方式去修改矩阵,而不是直接操作刚创建的局部矩阵。

错误原因拆解

你写的原函数代码:

path(n)=matrix(n,n,i,j);for(i=1,n-1,path(n)[i,i+1]=1);for(i=2,n,path(n)[i,i-1]=1);path(n)

这里的问题出在path(n)[i,i+1]=1这部分:它并不是在修改你刚创建的那个零矩阵,而是在递归调用path(n)函数,试图给它的返回值赋值——这在Pari/GP的语法里是不被允许的,所以会触发语法报错。

正确的实现方案

你需要先在函数内部创建一个局部矩阵变量,对这个变量直接做修改,最后返回它即可。Pari/GP里可以直接赋值创建局部变量,也可以用local()声明,下面是两种可行写法:

写法一:分步填充

path(n) = {
    M = matrix(n, n);  // 创建n×n的初始零矩阵
    for(i=1, n-1, M[i, i+1] = 1);  // 填充上三角的相邻边
    for(i=2, n, M[i, i-1] = 1);  // 填充下三角的相邻边
    M  // 返回最终的邻接矩阵(Pari/GP默认返回最后一行结果)
}

写法二:更紧凑的版本

可以把上下三角的填充合并成一个循环,代码更简洁:

path(n) = {
    M = matrix(n, n);
    for(i=1, n-1, M[i, i+1] = M[i+1, i] = 1);
    M
}

额外精简技巧

如果你想让代码更紧凑,还可以直接利用矩阵构造器的判断逻辑生成:

path(n) = matrix(n, n, i, j, if(abs(i-j) == 1, 1, 0))

这个写法直接通过判断两个顶点的索引差是否为1,来设置邻接矩阵的元素,效果和上面的函数完全一致。

测试验证

调用函数试试:

  • 输入path(2),返回结果:
[0 1; 1 0]
  • 输入path(3),返回结果:
[0 1 0; 1 0 1; 0 1 0]

完全符合路径图Pₙ的邻接矩阵定义。

内容的提问来源于stack exchange,提问作者Mystery_Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:34:05