使用嵌套的for循环填充Julia矩阵

时间:2019-01-21 17:13:10

标签: for-loop matrix julia

我有两个数组和一个空矩阵,我需要执行一个函数,使结果矩阵包括两个数组的每个组合。

不幸的是,我无法分别运行数组,因为它们都是函数的可选参数。我认为最好的方法是通过嵌套循环,但是现在我不确定...

我尝试将一个矩阵相乘,以便包括必要的重复项,但由于实际数据稍大,我为此感到困惑。

我尝试了这些嵌套循环的许多版本。

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]

3 个答案:

答案 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)