r - R中矩阵和向量之间的计算无需for循环

标签 r

假设我有一个矩阵和一个向量:

set.seed(999)
mat = matrix(round(rnorm(24,4,9)),3,8)
mat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    6  -13   -6   12   -8   12   10
[2,]   -8    2   -7   16    6    5  -15    1
[3,]   11   -1   -5    5   13    5   -7    7

vec = c(1,5, 4,4, 2,1, 4,8) 

现在我希望计算 mat 的每一行,该行与包含两个元素作为“组”的 vec 之间的距离。例如,我想要

d11 = |mat[1,1:2] - vec[1:2]|
d12 = |mat[1,3:4] - vec[3:4]|
d13 = |mat[1,5:6] - vec[5:6]|
d14 = |mat[1,7:8] - vec[7:8]|

mat 的其余行(即第 2 行和第 3 行)执行相同的操作,以获得 d21,...,d24, d31,...,d34

我希望这个任务可以在不使用for循环的情况下完成。有没有可以直接用于此目标的函数?谢谢!

最佳答案

我认为这有效:

s1 <- sweep(mat,2,vec,"-")  ## subtract vec
s2 <- s1^2                  ## square
s3 <- cbind(s2[col(s2) %% 2 ==1],s2[col(s2) %% 2 ==0])  ## stack
s4 <- rowSums(s3)
s5 <- matrix(s4,nrow=3)  ## restack
##      [,1] [,2] [,3] [,4]
## [1,]    1  389  181   68
## [2,]   90  265   32  410
## [3,]  136   82  137  122

可能有更好的方法来完成步骤 3,但其余的似乎接近最佳方法。 (您可能可以稍微加快步骤 1 的速度,如 t(t(mat)-vec),但为了便于阅读,我更喜欢 sweep。)

关于r - R中矩阵和向量之间的计算无需for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15400223/

相关文章:

Rcpp:如何保留 sourceCpp 生成的文件?

r - 提取r中数据框中每个字符串的第一部分

r - lin 的留一法 CV 实现。回归

r - 将数据框列表写入多个 excel 文件

r - 在 R 中多面 ggplot2 图的边缘内按因子着色点

r - plotly + ggplot2 : Some tooltips missing in stacked barplot

r - 根据向量生成重复序列

r - 需要 beta 回归预测和绘制曲线的示例

r - 如果条件包含 lubridate 包中的 `years` 函数,ifelse 命令总是返回 0

r - 如何使这个 R 包的输出静音?