我想编写一个函数,它将矩阵的列和行作为参数,并给出一个矩阵作为输出。
例如,一个函数采用 m × k 矩阵 A 的行 i 和 k × n 矩阵 B 的 j 列,并返回一个矩阵 M,其中元素 m_i,j 等于 min(A[i,] * B[,j])
(逐元素乘法):
有什么简单的方法可以避免使用循环吗?是否有 sapply
矩阵的等价物存在吗?
> matrix_A
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 2 3 4 5 6
[3,] 3 4 5 6 7
[4,] 0 1 2 3 4
[5,] 5 6 7 8 9
> matrix_B
[,1] [,2] [,3] [,4] [,5]
[1,] 7 6 5 4 3
[2,] 6 5 4 3 2
[3,] 1 2 3 4 5
[4,] 8 7 6 5 4
[5,] 9 8 7 6 5
>
> output_matrix <- matrix(, nrow=nrow(matrix_A), ncol=ncol(matrix_B))
> for (row_i in 1:nrow(matrix_A)) {
+ for (col_j in 1:ncol(matrix_B)) {
+ output_matrix[row_i, col_j] <- min(matrix_A[row_i,]*matrix_B[,col_j])
+ }
+ }
> output_matrix
[,1] [,2] [,3] [,4] [,5]
[1,] 3 6 5 4 3
[2,] 4 8 10 8 6
[3,] 5 10 15 12 8
[4,] 0 0 0 0 0
[5,] 7 14 21 18 12
>
最佳答案
使用 apply
从基础 R,
apply(m2, 2, function(i) apply(m1, 1, function(j) min(j*i)))
这使,
[,1] [,2] [,3] [,4] [,5] [1,] 3 6 5 4 3 [2,] 4 8 10 8 6 [3,] 5 10 15 12 8 [4,] 0 0 0 0 0 [5,] 7 14 21 18 12
一个完全矢量化的解决方案可以是,
t(matrix(do.call(pmin,
as.data.frame(
do.call(rbind, rep(split(m1, 1:nrow(m1)), each = 5)) * do.call(rbind, rep(split(t(m2), 1:nrow(m2)), 5)))),
nrow(m1)))
关于r - 应用一个函数,将矩阵的列和行作为输入,将矩阵作为输出,而不使用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49914324/