Заполнение матрицы Julia с помощью вложенных циклов - PullRequest
0 голосов
/ 21 января 2019

У меня есть два массива и пустая матрица, мне нужно выполнить такую ​​функцию, чтобы результирующая матрица включала каждую комбинацию двух массивов.

К сожалению, я не могу запустить массивы по отдельности, поскольку они оба являются необязательными параметрамидля функции.Я думал, что лучший способ сделать это через вложенные циклы, но теперь я не уверен ...

Я попытался умножить одну из матриц, чтобы она включала необходимые дубликаты, но я боролся с этим какреальные данные несколько больше.

Я пробовал много версий этих вложенных циклов.

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 голосов
/ 21 января 2019

Ваша проблема может быть решена с помощью вещания :

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)

Кстати, это называется «внешним произведением» (для f = *) или его обобщением. И если f является оператором , вы можете использовать вещание с инфиксной точкой: a' ∘. b.

0 голосов
/ 22 января 2019

Также список понимания:

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)
0 голосов
/ 21 января 2019

Разве это не просто

a'.*b

О, теперь мне нужно написать еще несколько символов, чтобы преодолеть минимально допустимую длину ответа, но мне нечего добавить, надеюсь, код не требует пояснений.

...