使用逻辑条件从矩阵中选择行

Selecting rows from matrix using logical conditions

我有两个矩阵 A 和 B。矩阵 B 是通过选择 A 的一些行形成的,使得 B 中的行数 <= A 中的行数。现在我必须制作一个矩阵 C,这样它应该仅包含 A 中不存在于 B 中的那些行。例如如下

A = 1 2
    2 3 
    3 4
    4 5
    5 6 

B = 2 3
    4 5 

C = 1 2
    3 4
    5 6

我得到了矩阵 A 和 B 及其维数。我尝试使用 'where' 如下,但出现分段错误。

  where(A(:,:).ne.B(:,:))
     C(:,1) = A(:,1)
     C(:,2) = A(:,2)
  end where

任何人都可以告诉我如何为 'where' 编写正确的逻辑条件或实现此目的的任何不同方法。谢谢。

PS:不会有重复行。 B 中的行序列将与 A 中的行序列匹配。

A where-construct 永远不会起作用,数组的大小各不相同,不适合赋值或逻辑运算。循环是要走的路。

鉴于您对 AB 的声明,我可能会这样声明 C

INTEGER, DIMENSION(:,:), ALLOCATABLE :: c

和一个索引数组(其用途将在更多行中变得明显),例如

INTEGER, DIMENSION(SIZE(a,1)) :: indx = [(ix,ix=1,SIZE(a,1))]

接下来分配C

ALLOCATE(c(SIZE(a,1)-SIZE(b,1),SIZE(a,2)))

接下来,遍历 BA 的元素。 (请注意,与 Fortran 一样,我不区分大小写。另请注意,我首先遍历了 B 的元素,然后遍历了 A。如果 AB大得多我可能会更加注意整理循环的顺序并在找到匹配项时 exit 内部循环。)随着循环的进行,将相应的索引值设置为 0.

  DO jx = 1, SIZE(b,1)
     DO ix = 1, SIZE(a,1)
        IF (ALL(a(ix,:)==b(jx,:))) indx(ix) = 0  
     END DO
  END DO

最后,我们可以这样填充 C

c = a(PACK(indx,indx/=0),:)