使用逻辑条件从矩阵中选择行
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 永远不会起作用,数组的大小各不相同,不适合赋值或逻辑运算。循环是要走的路。
鉴于您对 A
和 B
的声明,我可能会这样声明 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)))
接下来,遍历 B
和 A
的元素。 (请注意,与 Fortran 一样,我不区分大小写。另请注意,我首先遍历了 B
的元素,然后遍历了 A
。如果 A
或 B
大得多我可能会更加注意整理循环的顺序并在找到匹配项时 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),:)
我有两个矩阵 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 永远不会起作用,数组的大小各不相同,不适合赋值或逻辑运算。循环是要走的路。
鉴于您对 A
和 B
的声明,我可能会这样声明 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)))
接下来,遍历 B
和 A
的元素。 (请注意,与 Fortran 一样,我不区分大小写。另请注意,我首先遍历了 B
的元素,然后遍历了 A
。如果 A
或 B
大得多我可能会更加注意整理循环的顺序并在找到匹配项时 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),:)