R语言中outer函数为何对大于36的参数值无法正常工作?
这不是bug,而是你不小心搞混了complex()函数的参数顺序,再加上outer()的工作方式导致的问题,我来给你拆解清楚:
问题根源
1. complex()的参数顺序和你想的不一样
R中complex()函数的参数顺序是:length.out(指定输出向量的长度)→ real(实部)→ imaginary(虚部)。你可能误以为前两个参数是实部和虚部,这是核心误解。
2. outer()的工作逻辑
outer(X, Y, FUN, ...)不会逐个传递X和Y的元素给FUN,而是:
- 把X重复
length(Y)次,生成一个长度为length(X)*length(Y)的向量 - 把Y重复
each=length(X)次,生成另一个等长的向量 - 将这两个长向量作为前两个参数传给
FUN,再附加你提供的额外参数
当你运行outer(37:42, 37:42, complex, 1)时,实际调用的是:
complex(rep(37:42, 6), rep(37:42, each=6), 1)
这里第一个参数是长度36的向量(37到42重复6次),但length.out只接受单个整数,R会取向量的第一个元素37作为输出长度,导致complex()返回了一个长度37的向量。而outer()需要36个元素来构建6×6的矩阵,于是出现了维度不匹配的错误。
至于outer(36:42, 36:42, complex, 1)能运行,只是巧合:complex()返回了长度36的向量,R自动循环这个短向量来填充7×7=49的矩阵位置——这根本不是你想要的结果,只是表面“正常”而已。
正确写法
根据你的需求,这里提供两种场景的正确实现:
场景1:每个元素虚部固定为1,实部为X的元素
# 明确指定参数名称,避免顺序混乱 outer(37:42, 37:42, complex, real = rep(37:42,6), imaginary = 1) # 用匿名函数,逻辑更直观 outer(37:42, 37:42, function(x, y) complex(real = x, imaginary = 1))
场景2:每个元素实部为X的元素,虚部为Y的元素
# 用匿名函数明确参数对应关系 outer(37:42, 37:42, function(x, y) complex(real = x, imaginary = y)) # 直接构造矩阵,效率更高 matrix(complex(real = rep(37:42,6), imaginary = rep(37:42, each=6)), nrow=6)
这样就能得到你预期的复数矩阵,不会再出现维度错误了。
内容的提问来源于stack exchange,提问作者Omega1x
相关产品推荐
相关产品推荐

