如何将向量a的每个元素与数组c中的每个矩阵相乘?代码计算顺序异常求助
问题:数组与向量逐矩阵相乘的顺序错误
我用array函数生成了包含3个矩阵的数组,想要将向量a中的每个值分别与数组里的每个矩阵相乘,但运行代码后发现计算结果的顺序不符合预期,求解决方法。
我的代码如下:
N <- c("P1", "P2", "D1", "D2") a = matrix(c(16.2, 18, 21), ncol = 3) b <- matrix(c( 0, 2721, 3109, 1943, 2721, 0, 1166, 1943, 3109, 1166, 0, 1166, 1943, 1943, 1166,0 ), ncol = 4, dimnames = list(N, N)) c <- array(c(b), dim = c(4,4,3))[,,c(1:3)]* a[c(1:3)]
问题原因
问题出在R的广播机制和维度匹配上:
- 你定义的
a是1行3列的矩阵,用a[c(1:3)]提取后会变成长度为3的向量,但R在进行数组与向量相乘时,会按列优先的顺序循环向量元素,导致乘法的对应关系错位。 - 另外,你生成数组的方式
array(c(b), dim = c(4,4,3))[,,c(1:3)]可以简化,直接用array(b, dim = c(4,4,3))就能生成包含3个b矩阵的数组,不需要额外索引。
解决方案
要让a的每个元素对应数组的每个矩阵,需要让a的维度与数组的第三个维度匹配,这样广播机制就能正确对应相乘:
N <- c("P1", "P2", "D1", "D2") # 直接将a定义为向量,更直观 a <- c(16.2, 18, 21) b <- matrix(c( 0, 2721, 3109, 1943, 2721, 0, 1166, 1943, 3109, 1166, 0, 1166, 1943, 1943, 1166,0 ), ncol = 4, dimnames = list(N, N)) # 生成包含3个b矩阵的4×4×3数组 c_array <- array(b, dim = c(4,4,3)) # 将a转换为1×1×3的数组,匹配原数组的第三个维度 result <- c_array * array(a, dim = c(1,1,3)) # 验证结果:第一个矩阵是b×16.2,第二个是b×18,第三个是b×21 # 示例:查看第二个矩阵中P2行P1列的值,应为2721×18=48978 result[2,1,2]
这样处理后,数组的每个矩阵会准确对应a中的一个数值相乘,不会出现顺序错误。
内容的提问来源于stack exchange,提问作者Simen Fjælberg
相关产品推荐
相关产品推荐

