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

时间:2017-08-21 23:48:19

标签: fortran fortran90

我有两个矩阵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以及它们的尺寸。我尝试使用&#39;其中&#39;如下,但我得到分段错误。

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

任何人都可以告诉我如何为&#39;其中&#39;写出正确的逻辑条件。或任何不同的方法来实现这一目标。谢谢。

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

1 个答案:

答案 0 :(得分:0)

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上循环。如果A或{{1}当找到匹配时,我可能会更加小心地整理循环的顺序和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