将一个矩阵的每一行与另一个矩阵的所有行相结合

3

我是一名有用的助手,可以为您进行文本翻译。

我有两个矩阵(expmatmat)。 假设 expmat 是:

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

并且 mat

[1,]   -2   -2   -2   -2   -2
[2,]    2   -2   -2   -2   -2
[3,]   -2    2   -2   -2   -2
[4,]    2    2   -2   -2   -2
[5,]   -2   -2    2   -2   -2
[6,]    2   -2    2   -2   -2
[7,]   -2    2    2   -2   -2

我希望创建一个循环,每个周期中我将一行从expmat加入到mat的所有行中,以便最终创建8个矩阵,在每个矩阵中,前5列完全相同(来自expmat的行),其他列会因为来自mat而改变。例如,给定示例的前2个矩阵如下:
Matrix1
-1   -1   -1   -1   -1   -2   -2   -2   -2   -2
-1   -1   -1   -1   -1    2   -2   -2   -2   -2
-1   -1   -1   -1   -1   -2    2   -2   -2   -2
-1   -1   -1   -1   -1    2    2   -2   -2   -2
-1   -1   -1   -1   -1   -2   -2    2   -2   -2
-1   -1   -1   -1   -1    2   -2    2   -2   -2
-1   -1   -1   -1   -1   -2    2    2   -2   -2

Matrix 2
1   -1   -1   -1   -1   -2   -2   -2   -2   -2
1   -1   -1   -1   -1    2   -2   -2   -2   -2
1   -1   -1   -1   -1   -2    2   -2   -2   -2
1   -1   -1   -1   -1    2    2   -2   -2   -2
1   -1   -1   -1   -1   -2   -2    2   -2   -2
1   -1   -1   -1   -1    2   -2    2   -2   -2
1   -1   -1   -1   -1   -2    2    2   -2   -2

这是我正在做的事情:
for(row in 1:nrow(expmat)) {
for(row in 1:nrow(expmat)) {
val<-expmat[row,]
val<-as.matrix(val)
dshybrid=merge(t(val),mat, by=0, all=TRUE)
print(dshybrid)}

然而我得到了所需的内容。
-1   -1   -1   -1   -1   -2   -2   -2   -2   -2
NA     NA     NA     NA     NA   2   -2   -2   -2   -2
NA     NA     NA     NA     NA   -2    2   -2   -2   -2
NA     NA     NA     NA     NA    2    2   -2   -2   -2
NA     NA     NA     NA     NA   -2   -2    2   -2   -2
NA     NA     NA     NA     NA    2   -2    2   -2   -2
NA     NA     NA     NA     NA   -2    2    2   -2   -2
....
2个回答

1
这种方法很有效:
lapply(split(expmat, row(expmat)), function(u){
  cbind(matrix(rep(u,nrow(mat)), ncol=ncol(mat), byrow=T), mat)
})

基本上 split 会将 expmat 的行转换成一个列表,然后对于每一行,您需要将其复制 7 次并与 mat 矩阵合并。这将给您 8 个所需的矩阵。


0

循环遍历expmat的每一行,并使用cbind将其与mat连接:

lapply(1:nrow(expmat), function(x) cbind(expmat[rep(x,nrow(mat)),],mat) )

需要使用rep,以便将expmat的单行重复连接到它正在连接到的每个mat行。例如,在一个非常简单的例子中:

expmat <- matrix(1:4,nrow=2)
mat    <- matrix(5:8,nrow=2)
lapply(1:nrow(expmat), function(x) cbind(expmat[rep(x,nrow(mat)),],mat) )

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接