当前位置: 首页 > 知识库问答 >
问题:

对两个矩阵的所有行对使用函数

上官锦
2023-03-14

如果我想计算两个向量的n维距离,我可以使用如下函数:

a = c(1:10)
b = seq(20, 23, length.out = length(a))

test_fun = 
  function(x,y) {
    return(
      sqrt(
        sum(
          (x - y) ^ 2
        )
      )
    )
  }

n_distance = test_fun(a,b)

现在,我想把它扩展到一个矩阵设置:我想计算两个矩阵的每对行的n维距离。

set.seed(123)
a_mtx = matrix(1:30, ncol = 5)
b_mtx = matrix(sample(1:15,15), ncol = 5)

n_distance_mtx = 
matrix(
  NA,
  nrow = nrow(b_mtx), 
  ncol = nrow(a_mtx)
  )
for(i in 1:nrow(b_mtx)) {
 for(j in 1:nrow(a_mtx)) {
  n_distance_mtx[i,j] = 
    test_fun(a_mtx[j,], b_mtx[i,])
 }
}

其中,n_distance_mtx的每一列都包含a_mtxb_mtx的每一行之间的距离度量(因此n_distance_mtx[,1]a_mtx[1,]b_mtx[1:3,]之间的距离。

如果我在n_distance_mtx上计算列平均值,我可以获得a_mtx中每行与b_mtx所有行之间的平均距离。

colMeans(n_distance_mtx)
#[1] 23.79094 24.90281 26.15618 27.53303 29.01668 30.59220

所以23.79094是a_mtx[1,]b_mtx[1:3,]之间的平均距离,24.90281是a_mtx[2,]b_mtx[1:3,]之间的平均距离,以此类推。

问:如果不使用for循环,如何得到相同的解决方案?

我想将此方法应用于维度大得多的矩阵(数十万行的数量级)。看这个看这个,好像肯定有办法用一个Vectorized函数来完成这个,但是我一直无法生成这样的函数。

test_fun_vec = 
 Vectorize(
   function(x,y) {
     outer(
       x,
       y,
       test_fun
       )
   }
 )
test_fun_vec(a_mtx,b_mtx)
#[1]  4  0  2  7  4  6  3  5  1  5  7  5 10  0  9 11 15 17  8 11  9 12 10 16
#[25] 10 22 20 25 15 24

共有2个答案

宗安宁
2023-03-14

如果我理解对了你的问题,你需要a_mtx中每个向量(行)到b_mtx中其他向量之间的欧氏距离。

如果是这样,您可以像这样使用apply两次:

result = apply(a_mtx, 1, function(x){ apply(b_mtx, 1, function(y){ test_fun(x,y) })})

这给出了一个距离矩阵:

         [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
[1,] 20.88061 21.84033 22.97825 24.26932 25.69047 27.22132
[2,] 24.87971 25.57342 26.43861 27.45906 28.61818 29.89983
[3,] 25.61250 27.29469 29.05168 30.87070 32.74141 34.65545

其中行索引是来自b_mtx的相应向量(row),列索引是来自a_mtx的相应向量

最后,使用以下公式获得平均距离:

colMeans(result)
[1] 23.79094 24.90281 26.15618 27.53303 29.01668 30.59220
施誉
2023-03-14

我们可以使用Vectorize外部

f1 <- Vectorize(function(i, j) test_fun(a_mtx[j, ], b_mtx[i, ]))
out <- outer(seq_len(nrow(b_mtx)), seq_len(nrow(a_mtx)), FUN = f1)
out
#         [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
#[1,] 20.88061 21.84033 22.97825 24.26932 25.69047 27.22132
#[2,] 24.87971 25.57342 26.43861 27.45906 28.61818 29.89983
#[3,] 25.61250 27.29469 29.05168 30.87070 32.74141 34.65545

colMeans(out)
#[1] 23.79094 24.90281 26.15618 27.53303 29.01668 30.59220

identical(n_distance_mtx, out)
#[1] TRUE
 类似资料:
  • 特殊矩阵——对称矩阵(Symmetric Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 对称矩阵的概念 元素以主对角线为对称轴对应相等的矩阵。 2. 对称矩阵的特性 对角矩阵都是对称矩阵,对称矩阵必须是方形矩阵

  • 使用JCUDA对复数进行运算的最佳方法是什么?我应该使用cuComplex格式还是有其他的解决方案(像一个数组,实部和虚部一个接着一个走)?我非常感谢使用这种类型的计算的java代码示例。 由于我的目的是用GPU求解复杂的线性方程组,所以我不想只附上jCuda。用GPU进行这样的计算有哪些可供选择的方式?

  • 校验者: @FontTian @numpy 翻译者: @程威 The sklearn.metrics.pairwise 子模块实现了用于评估成对距离或样本集合之间的联系的实用程序。 本模块同时包含距离度量和核函数,对于这两者这里提供一个简短的总结。 距离度量是形如 d(a, b) 例如 d(a, b) &lt; d(a, c) 如果对象 a 和 b 被认为 “更加相似” 相比于 a 和 c. 两个

  • 给定矩阵(大小by)和幂,(例如,4),产生矩阵,其中每个-th矩阵包含所有中的列在该程度上的可能组合。 在我当前的方法中,我生成-th矩阵,然后在下一次调用中使用它来生成th矩阵。对于给定的功率,这是否可以“自动”完成,而不是手动完成? 说到R,我是一个新手,我明白有可能比下面的尝试更有效、更优雅地实现这个解决方案。。。 有人能提供一些建议吗?我的目标是为给定的矩阵创建一个函数,并以更“自动化”

  • 假设我们有两个矩阵,即和,分别为和。 我们如何才能找到哪些行与行相同(反之亦然)? 优选的输出是矩阵,其行数等于矩阵和之间的标识行,两列,即第一列包含矩阵的行数,第二列包含矩阵的行数。

  • 特殊矩阵——三对角矩阵(Tridiagonal Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 三对角矩阵的概念 三对角矩阵就是对角线、邻近对角线的上下次对角线上有元素,其他位置均为0的矩阵。 三对角矩阵是一种特