【问题标题】:Vector ordering向量排序
【发布时间】:2022-01-02 03:20:24
【问题描述】:

我有一个算法来订购一个向量l(i),其中的组件按升序排列,我还生成了一个向量顺序D(i),它告诉我每个组件来自哪里,所以我可以回到原来的(无序)向量。

顺序和顺序向量很好,当我想回到原来的时候出现问题。由于某种原因它不起作用,它重复向量的组件而不是按特定顺序。我不知道它是什么。

代码如下:

program order
  implicit none
  integer i,j,k,q
  integer l(7),D(7)
  real x


  do i=1,7
     call random_number (x)
     l(i)=1+FLOOR(13*x)
  enddo
  Write(*,*) "Without order"
  do i=1,7
     Write(*,*) l(i)
  enddo
  do i=1,7
     D(i)=i
  enddo
  
  do i=1,6
     do j=i+1,7
        if(l(i).gt.l(j))then
        k=l(i)
        l(i)=l(j)
        l(j)=k
        q=D(i)
        D(i)=D(j)
        D(j)=q
        endif
     enddo
  enddo

  Write(*,*) "Ordered"


  do i=1,7
     Write(*,*) l(i)
  enddo
  Write(*,*) "Order vector"
   do i=1,7
      Write(*,*) D(i)
   enddo
  do i=1,7
    l(D(i))=l(i)
  enddo
  Write(*,*) "The original vector is"
  do i=1,7
    Write(*,*) l(i)
  enddo

endprogram order

【问题讨论】:

  • Fortran 支持向量下标。如果D持有原仓位,那么I(D)就是原订单。
  • 欢迎您,请拨打tour 并阅读How to Ask。请更好地解释问题。不要说“它不起作用”,它没有说任何有用的东西。告诉我们出了什么问题。结果不正确吗?究竟有多不正确?还是有一些错误信息?你写道它发生在最后一步,但实际发生了什么?顺序不正确吗?有多不正确?或者有什么问题?
  • 语句:`l(D(i))=l(i)` 将导致l 的元素已经有一个替换值但它的值还没有被替换放在后面的某个地方。 (请注意,您的程序无法编译,因为您没有声明 kq。此外,我不会在代码中使用像 67 这样的数字,而是在此处使用 nmax 的值。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • “nota un a specific perder”是什么意思。您关于用7 替换nmax 的编辑与我的一般建议相反,即在任何地方使用数字67, better to use instead of 7` 而不是nmax 而不是6 nmax -1

标签: arrays sorting vector fortran


【解决方案1】:

正如@albert 指出的那样,因为您的l(D(i))=l(i) 循环就地覆盖了l,所以您正在破坏信息。考虑一个简单的例子

nmax = 2
l = [1,2]
D = [2,1]

展开你的循环给出

l(D(1))=l(1)
l(D(2))=l(2)

l(2)=l(1)
l(1)=l(2)

并跟踪l 的值,我们看到

! l = [1,2]
l(2)=l(1)
! l = [1,1]
l(1)=l(2)
! l = [1,1]

因此,您要么需要在循环之前制作l 的副本,然后从那里开始工作,要么正如@steve 指出的那样,您需要使用vector subscript 在一个操作中完成整个操作,在这种情况下整个循环会变成

l(D) = l

确实,可以使用整个数组操作而不是循环来简化大部分代码,例如

program order
  implicit none
  integer :: i,j,k,q
  integer, parameter :: nmax=7
  integer :: l(nmax),D(nmax)
  real :: x(nmax)
  
  ! Set `l` to a random vector.
  call random_number(x)
  l = 1+floor(13*x)
  
  write(*,*) "Without order"
  write(*,'(I2)') l
  
  ! Set `D` to [1,2,3,4,5,6,7].
  D = [(i, i=1, nmax)]
  
  ! Sort `l` and `D` together.
  do i=1,nmax-1
    do j=i+1,nmax
      if (l(i) > l(j)) then
        ! Swap `l(i)` and `l(j)`.
        l([i,j]) = l([j,i])
        ! Swap `D(i)` and `D(j)`.
        D([i,j]) = D([j,i])
      endif
    enddo
  enddo

  write(*,*) "Ordered"
  write(*,'(I2)') l
  
  write(*,*) "Order vector"
  write(*,'(I2)') D
  
  ! Unsort `l`.
  l(D) = l
  
  write(*,*) "The original vector is"
  write(*,'(I2)') l
end program order

【讨论】:

  • 很好的解决方案!。我从来没有想过像你所做的那样用矢量下标交换元素:l([i,j]) = l([j,i])。今天学到了新东西!您的代码与我的 WIP 代码几乎相同,除了我的最后一行是 l = l(D),它给出了错误的顺序。
  • 仍然有同样的问题:/。谢谢@veryreverie。我使用了辅助向量并且工作了!
  • @albert 谢谢你,我用nmax再次重写了代码,我最初使用它但我理解错了,对不起。
猜你喜欢
  • 2016-02-28
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多