r - 应用一个函数,将矩阵的列和行作为输入,将矩阵作为输出,而不使用循环

标签 r matrix vectorization

我想编写一个函数,它将矩阵的列和行作为参数,并给出一个矩阵作为输出。

例如,一个函数采用 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/

相关文章:

r - 结合条件

r - 一次加载多个文件?

c++ - 在 MKL 中求矩阵的矩阵指数

python - MATLAB 和 Python 中的逆矩阵结果不同

python - 如何通过应用 numpy 向量化使用条件检查从 python 列表或 numpy 数组中提取值?

python - Numba @guvectorize([(float64[ :], int64)], '(n),()->(n)' ) IndexError: 列表索引超出范围

r - 如何在shinydashboard中创建让每个选项卡都有自己的日期输入范围的选项

r - 在模型列表上使用stepAIC

matrix - 莫林矩阵与 Google Drive 电子表格

r - 在没有矢量化 FUN 参数的情况下调用外积