首页 > 解决方案 > 矩阵的一行及其在R中的同一矩阵中反转

问题描述

有没有办法找到矩阵的一行是否包含在矩阵中但以相反的方式?

例如,这发生在以下矩阵中W

       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
  [1,]    1    1    1    2    2    2    3    3    3
  [2,]    1    2    3    1    2    3    1    2    3
  [3,]    3    3    3    2    2    2    1    1    1

在第一排和第三排之间。

我已经开发了以下代码,但它仅在矩阵中以相反的方式存在行时才有效:

WW=W[, rev(seq_len(ncol(W)))]

x=match(data.frame(t(W)), data.frame(t(WW)))
A=cbind( c(1:nrow(W)),x )

Z=t(apply(A,1,sort)) 

x=unique(Z[,2])
W=W[-x,]

所以,在前面的矩阵W中,我的代码不起作用,因为NA在代码的第二行的结果中。

我们如何解决这个问题?

标签: rmatrixreversena

解决方案


“有什么方法可以找出矩阵中的一行是否包含在矩阵中但以相反的方式?”

是的,计算行之间的距离。如果您的矩阵不是那么大,这是非常有效的:

m <- matrix(c(1, 1, 3, 1, 2, 3, 1, 3, 3, 2, 1, 2, 2, 2, 2, 2, 3, 2, 3, 1, 1, 3, 2, 1, 3, 3, 1), nrow = 3)
res <- as.matrix(dist(rbind(m, 
                            m[, rev(seq_len(ncol(m)))])))
res <- res[nrow(m) + seq_len(nrow(m)), seq_len(nrow(m))]
rownames(res) <- seq_len(nrow(m))

which(!res, arr.ind = TRUE)
#  row col
#3   3   1
#1   1   3

any(!res)
[1] TRUE

推荐阅读