0

配列から2Dの繰り返しノードをすべて消去する機能が可能かどうか知りたいのですが、次のようになります。

A(xy、1:2)

A( xy 、1)= / 1,2,4、5、5,9,6,8,2、5、4 /

A(xy、2)= / 5,2,5、6、7,6,6,3,7、6、6 /

A(xy、1)= / 1,2,4、5、5,9,6,8,2,4 /

A(xy、2)= / 5,2,5、6、7,6,6,3,7,6 /


空白のプログラムで@HighPerformanceMarkのコードを実行しようとすると、コンパイルエラーがいくつか発生します。

  repeating.f90:24.20:

       mask(ix) = NOT(ANY(arraya(1,:ix-1)==arraya(1,ix).AND.&
                      1
  Error: 'i' argument of 'not' intrinsic at (1) must be INTEGER
  repeating.f90:29.11:

    ALLOCATE(index_vector, source=PACK([(ix, ix=1,numcols) ],mask))
             1
  Error: Array specification required in ALLOCATE statement at (1)
  repeating.f90:32.11:
...

これについてあなたは何を言うことができますか?

4

2 に答える 2

1

はい、これがあなたが望むことをする1つの方法です。これは、その場で A のサイズを変更するのではなく、配列 A の一意の要素を B という新しい配列にコピーすることに注意してください。1 文字の名前はコーディング基準に反するため、配列arrayaを呼び出しました。arrayb

PROGRAM test

  USE iso_fortran_env

  IMPLICIT NONE

  INTEGER, PARAMETER :: numrows = 2
  INTEGER, PARAMETER :: numcols = 11

  INTEGER, DIMENSION(numrows,numcols) :: arraya
  LOGICAL, DIMENSION(:), ALLOCATABLE :: mask
  INTEGER, DIMENSION(:,:), ALLOCATABLE :: arrayb
  INTEGER :: ix
  INTEGER, DIMENSION(:), ALLOCATABLE :: index_vector

  arraya(1,:) = [1,2,4,5,5,9,6,8,2,5,4]
  arraya(2,:) = [5,2,5,6,7,6,6,3,7,6,6]

  ! First, find the duplicate elements
  ALLOCATE(mask(numcols))
  mask = .TRUE.

  DO ix = numcols,2,-1
     mask(ix) = .NOT.(ANY(arraya(1,:ix-1)==arraya(1,ix).AND.&
                    arraya(2,:ix-1)==arraya(2,ix)))
  END DO

  ! Make an index vector
  ALLOCATE(index_vector, source=PACK([(ix, ix=1,numcols) ],mask))

  ! Now copy the unique elements of a into b
  ALLOCATE(arrayb, source=arraya(:,index_vector))

END PROGRAM test

次の点にも注意してください。

  • 私はこれをプログラムとして書きましたarrayb
  • エラーチェックやそのようなものはありません。これは本番対応のコードではありません。
  • index_vector最後のステートメントをこのように省略して書き直すこともできますがALLOCATE(arrayb, source=arraya(:,PACK([(ix, ix=1,numcols) ],mask)))、(a) ちょっと不可解であり、(b) テストしていません。
  • 入力データといくつかの小さなバリエーションでこれをテストしただけです。
  • これにより、複製された要素の最初 (一番左) のインスタンスが保持されます。
于 2013-01-03T12:16:44.180 に答える