【问题标题】:Multiplying one matrix with a set of scalars将一个矩阵与一组标量相乘
【发布时间】:2015-10-12 11:43:48
【问题描述】:

我有一个 R 脚本,它通过标量乘法系统地执行对 3x3 矩阵的更改,如下所示

R <- matrix(rexp(9, rate=.1), ncol=3);
for (i in 1:360) {
K = i*R;
...
}

并使用修改后的矩阵在循环中进行进一步计算。但是,循环本身嵌套在另外两个 for 循环中,使得脚本非常慢。所以我的问题是,我怎样才能对这个最内层循环进行矢量化,使得结果是一个大小为 3x3x360 的三维数组 A,其中

A[,,i] = i*R;

对于从 1 到 360 的所有 i?

【问题讨论】:

  • 有趣的问题。生成的数组将非常规则且可预测,因为每个“层”将通过一组标量与所有其他层相关。您的代码有什么办法可以解决需要创建很大的数组。你可以使用Alyr &lt;- function(i){R*i}
  • 在您的循环中,每次都以R 开头并添加R?不过,我不认为乘法会减慢你的速度。我很确定这需要很少的时间。
  • 这里简化了修改。我实际上在做的是在矩阵表示法中使用Rodrigues' rotation formula 来计算大量的旋转矩阵。然后我将这些应用于大量向量并评估结果。所以“真正的”修改看起来像 K = I + sin(thetapi/180)*T + (1-cos(thetapi/180))*(T%*%T),其中 I 是单位矩阵,T 是叉积矩阵。所以不幸的是,数组中的不同层不是那么可预测的......

标签: r matrix scalar


【解决方案1】:

一些基本的乘法和整形怎么样

set.seed(15) #for reproducibility
R <- matrix(rexp(9, rate=.1), ncol=3);
R
#           [,1]      [,2]      [,3]
# [1,]  2.042281  1.760375 2.9230182
# [2,] 19.466458  6.628580 0.1818078
# [3,]  2.544348 27.541514 4.1325714

dd <- array(sapply(1:360, `*`, R), dim=c(dim(R), 360))
dd[,,1]
#           [,1]      [,2]      [,3]
# [1,]  2.042281  1.760375 2.9230182
# [2,] 19.466458  6.628580 0.1818078
# [3,]  2.544348 27.541514 4.1325714
dd[,,2]
#           [,1]      [,2]      [,3]
# [1,]  4.084562  3.520749 5.8460364
# [2,] 38.932916 13.257161 0.3636157
# [3,]  5.088697 55.083027 8.2651427
dd[,,10]
#           [,1]      [,2]      [,3]
# [1,]  20.42281  17.60375 29.230182
# [2,] 194.66458  66.28580  1.818078
# [3,]  25.44348 275.41514 41.325714

【讨论】:

  • 简单!你还可以使用sapply 进行更复杂的修改吗?如K = I + sin(i*pi/180)*R,其中I是3x3单位矩阵?
  • 当然,我用`*`的地方你可以放任何函数function(i,R) I+sin(i*pi/180)*R)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多