r - 循环矩阵 - 向量乘法,其元素随每个循环而变化
问题描述
我有一个包含非常大的矩阵和向量的数据集。我想将一个矩阵与一个向量相乘,该向量具有一个“1”元素,其余元素为零。我想循环这个计算,以便向量中每个可能的 1 和 0 组合都与矩阵相乘,并将结果存储在向量中。
我举一个我正在尝试做的例子。
我有两个矩阵,a
并且b
:
a <- matrix(1:16, nrow = 4, byrow = TRUE)
b <- matrix(17:32, nrow = 4, byrow = TRUE)
和一个带有 1 和 0 的向量。由于我还不知道如何循环好,我写下每个组合的代码:
c1 <- rep(0, times = 4)
c1[1] <- 1
c2 <- rep(0, times = 4)
c2[2] <- 1
c3 <- rep(0, times = 4)
c3[3] <- 1
c4 <- rep(0, times = 4)
c4[4] <- 1
我a
与每个向量组合c
相乘,将其对角化,将其与b
每一行和每一列相乘并求和。然后我将此结果存储在一个向量中results
:
d1 <- sum(colSums(b %*% diag(as.vector(a %*% c1), nrow = 4)))
d2 <- sum(colSums(b %*% diag(as.vector(a %*% c2), nrow = 4)))
d3 <- sum(colSums(b %*% diag(as.vector(a %*% c3), nrow = 4)))
d4 <- sum(colSums(b %*% diag(as.vector(a %*% c4), nrow = 4)))
results <- cbind(d1, d2, d3, d4)
这给出了:
d1 d2 d3 d4
[1,] 2824 3216 3608 4000
有没有比我在这里做的更有效的代码行?
解决方案
由于计算的特殊结构,您可以将其缩短为
a <- matrix(1:16, nrow = 4, byrow = TRUE)
b <- matrix(17:32, nrow = 4, byrow = TRUE)
results <- apply(a, 2, function(ai) sum(b %*% ai))
# [1] 2824 3216 3608 4000
甚至更短
colSums(b %*% a)
# [1] 2824 3216 3608 4000
推荐阅读
- rxjs - 如何按顺序在两个 Observable 之间切换并让订阅触发两次?
- javascript - 如何根据 Google 表格中的范围自动更新 Google 表单中的下拉列表?
- visual-studio - 设置 Xamarin.Forms 和 Visual Studio 2019 以与 mac ISSUE 配对
- opencv - 使用 opencv 对手绘形状进行分类
- angular - Angular 组件的单元测试 Jasmine 问题“失败:未定义 XMLHttpRequest”
- c# - 选择第 7 个人(行)并得到 7 作为结果
- reactjs - 在测试期间从 React 自定义钩子读取属性时出错
- r - Networkd3 Sankey 图不会打印到 HTML
- html - javascript中鼠标位置的事件
- python - 如何安装 discord.py 库