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
相关产品推荐
相关产品推荐

