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

Fortran生成n列2^n行二进制矩阵问题求助

解决Fortran生成二进制矩阵的问题

问题说明

需要生成一个n列、2n行的矩阵,初始全0,每行对应从0到2n-1的二进制数(逐位递增),最终最后一行为全1。例如n=2时矩阵为:

0 0
0 1
1 0
1 1

原代码问题分析

  • ibset函数是对单个整数的指定位置1,直接作用于整个矩阵会导致不符合预期的结果,并非逐个元素修改。
  • 后续的双重循环do i=1,Comb; do j=1,numSitio; MatrixSpins(i,j)=0把矩阵全部重置为0,完全覆盖了之前的操作。
  • 矩阵维度固定为10x10,无法适配更大的n值,灵活性不足。

正确实现代码

以下是修正后的代码,采用动态分配数组适配任意合法n值,利用btest函数判断二进制位是否为1:

program binary_matrix
    implicit none
    integer :: numSitio, Comb, i, j
    integer, dimension(:,:), allocatable :: MatrixSpins

    print*, "Set the number of sites: "
    read(*,*) numSitio

    Comb = 2 ** numSitio
    ! 动态分配矩阵:行数为Comb,列数为numSitio
    allocate(MatrixSpins(Comb, numSitio))

    ! 填充矩阵:每行对应十进制数i-1的二进制各位
    do i = 1, Comb
        do j = 1, numSitio
            ! btest(数, 位索引):判断该位是否为1
            ! 这里n-j对应二进制位的索引(从0开始),保证第一列为高位
            MatrixSpins(i,j) = merge(1, 0, btest(i-1, numSitio - j))
        end do
    end do

    ! 打印矩阵
    print*, "Generated matrix:"
    do i = 1, Comb
        write(*,'(100I2)') (MatrixSpins(i,j), j=1, numSitio)
    end do

    ! 释放动态分配的内存
    deallocate(MatrixSpins)

end program binary_matrix

代码解释

  • 动态数组:使用allocate根据输入的numSitio分配合适大小的矩阵,避免固定维度的限制。
  • btest函数:btest(x, pos)返回逻辑值,表示整数x的第pos位(从0开始计数,最低位为0)是否为1。
  • merge函数:根据btest的结果,将1或0赋值给矩阵元素,实现二进制位到矩阵列的映射。
  • 行映射:行号i对应十进制数i-1(因为矩阵第一行对应0),numSitio - j保证第一列为二进制高位,与示例格式一致。

测试示例

输入n=2时,输出为:

Generated matrix:
 0 0
 0 1
 1 0
 1 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:05:23