我有两个矩阵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的行。
答案 0 :(得分:0)
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
或{{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