我有两个数组和一个空矩阵,我需要执行一个函数,使结果矩阵包括两个数组的每个组合。
不幸的是,我无法分别运行数组,因为它们都是函数的可选参数。我认为最好的方法是通过嵌套循环,但是现在我不确定...
我尝试将一个矩阵相乘,以便包括必要的重复项,但由于实际数据稍大,我为此感到困惑。
我尝试了这些嵌套循环的许多版本。
a = [ 1 2 3 ]
b = [ 4 5 6 7 ]
ab = zeros(3,4)
for i = 1:length(a)
for j = 1:length(b)
ab[??] = function(x = a[??], y = b[??])
end
end
ab = [1x4 1x5 1x6 1x7,2x4 2x5 2x6 2x7,3x4 3x5 3x6 3x7]
答案 0 :(得分:2)
那不只是
a'.*b
?
哦,现在我必须写一些更多的字符才能超过可接受的最小答案长度,但是我真的没有什么要补充的,我希望代码是不言自明的。
答案 1 :(得分:2)
您的问题可以通过broadcasting解决:
julia> f(x, y) = (x,y) # trivial example
f (generic function with 1 method)
julia> f.([1 2 3]', [4 5 6 7])
3×4 Array{Tuple{Int64,Int64},2}:
(1, 4) (1, 5) (1, 6) (1, 7)
(2, 4) (2, 5) (2, 6) (2, 7)
(3, 4) (3, 5) (3, 6) (3, 7)
a'
中的质数转置a
以使形状正确计算。
但是请注意,a = [ 1 2 3 ]
构造了一个1×3 Array{Int64,2}
,它是一个矩阵。对于矢量(可能称为“数组”),请使用逗号:a = [ 1, 2, 3 ]
等。如果您使用的是这种形式的数据,则必须以另一种方式转置:
julia> f.([1,2,3], [4,5,6,7]')
3×4 Array{Tuple{Int64,Int64},2}:
(1, 4) (1, 5) (1, 6) (1, 7)
(2, 4) (2, 5) (2, 6) (2, 7)
(3, 4) (3, 5) (3, 6) (3, 7)
顺便说一句,这称为"outer product"(对于f = *
)或它的概括。如果f
是运营商∘
,则可以使用点缀中的广播:a' ∘. b
。
答案 2 :(得分:1)
还有一个列表理解:
julia> a = [1,2,3];
julia> b = [4,5,6,7];
julia> ab = [(x,y) for x in a, y in b]
3×4 Array{Tuple{Int64,Int64},2}:
(1, 4) (1, 5) (1, 6) (1, 7)
(2, 4) (2, 5) (2, 6) (2, 7)
(3, 4) (3, 5) (3, 6) (3, 7)