将一个矩阵乘以一组标量

3

我有一个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;

对于所有i从1到360的范围?


1
有趣的问题。结果数组将非常规律和可预测,因为每个“层”都与所有其他层相关联,由一组标量确定。您的代码是否有任何方法可以避免需要创建大型数组的情况?您可以使用Alyr <- function(i){R*i} - CJB
在你的循环中,从 R 开始并每次加上 R?我不认为乘法会拖慢你的速度,虽然我相信它需要很少的时间。 - Frank
这里简化了修改。实际上我正在使用罗德里格斯旋转公式的矩阵表示来计算大量的旋转矩阵。然后,我将这些矩阵应用于一组大量的向量并评估结果。因此,“真正”的修改看起来像K = I + sin(thetapi/180)T + (1-cos(thetapi/180))(T%*%T),其中I是单位矩阵,T是叉积矩阵。所以不幸的是,数组中的不同层次并不是那么可预测的... - Christofer Östlin
1个回答

4

如何进行基本的乘法和重塑操作

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单位矩阵? - Christofer Östlin
1
当然,你可以在我使用 \*`的地方放置任何函数function(i,R) I+sin(i*pi/180)*R)`。 - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接