R:如果我有两个矩阵,一个具有几乎相同的列,但混合了。如何有效地映射这两个矩阵?

时间:2017-07-20 19:28:32

标签: arrays r matrix optimization

在两个矩阵中,有一个有i)不同顺序的列和ii)整列(列中的每个元素)具有相反的不同符号。一个例子是

A = 1 2
    3 4

b = 1.99 -1.02
    3.99 -2.99 

如何重新排序b,使其看起来像:

b = 1.02 1.99
    2.99 3.99

在R中快速完成这项工作吗?

2 个答案:

答案 0 :(得分:1)

您可以将其视为优化问题 - 通过重新排序其中一个矩阵中的列来最小化两个矩阵之间的绝对差异。

示例数据

A <- matrix(c(1, 2, 3, 4), nrow = 2)
A
     [,1] [,2]
[1,]    1    3
[2,]    2    4

b <- matrix(c(-2.99, 3.99, -1.02, 1.99), nrow = 2) 
b
      [,1]  [,2]
[1,] -2.99 -1.02
[2,]  3.99  1.99

优化/搜索

# Data frame with a row for every possible column arrangement

ordering <- (expand.grid(rep(list(1:ncol(A)), ncol(A))))
ordering

  Var1 Var2
1    1    1
2    2    1
3    1    2
4    2    2

# Create a function to compute the difference for a particular arrangement

loss <- function(i) {
    ord <- unlist(ordering[i, ])
    sum(abs(abs(A) - abs(b[, ord])))
}

# Find the best arrangement
result <- optimize(loss, 1:nrow(ordering))

result$minimum    # row index from the data frame
[1] 2.145956

# Extract the row to get the actual solution

solution <- unname(unlist(ordering[result$minimum, ]))

solution
[1] 2 1

验证

A
     [,1] [,2]
[1,]    1    3
[2,]    2    4

b[, solution]
      [,1]  [,2]
[1,] -1.02 -2.99
[2,]  1.99  3.99

答案 1 :(得分:0)

假设您的矩阵与示例中的矩阵一样小,您可以通过以下方式更改列的顺序:

您的示例表示您要切换第一列和第二列。我们可以通过重新排序列索引来实现这一点:

b <- b[ , c(2, 1)] 

c(2, 1)表示从现在开始,第2列将显示为第一列,然后第1列将显示为第二列。我们在索引运算符的列部分中指定它,并将行部分留空。

如果我们想要更改整个列的符号,我们可以对特定列执行操作,如下所示:

b[ , 1] <- -1*b[ , 1]

这使得现在第一列的每个值都乘以-1。

如果你正在处理的矩阵要大得多,这可能是一种不切实际的方法。