Как преобразовать массив массива в матрицу?

Предположим, что я хочу применить вектор-функцию phi к вектору x:

phi(x, d) = [x.^i for i=0:d]    # vector-valued function
x = rand(7)                     # vector
y = phi(x, 3)                   # should be matrix, but isn't

Теперь y должен быть матрицей, но это 4-element Array{Array{Float64,1},1}, т.е. массив массивов. На самом деле, я хочу, чтобы y была матрицей. Является ли реализация phi неправильной? Или как его преобразовать?

Спасибо!

Ответ 1

Как вы отметили, вы можете объединить массив массивов x с помощью hcat(x...), но обычно лучше создать матрицу для начала. Два способа сделать это в этом случае:

  • Использование широковещания:

    phi(x, d) = x.^((0:d)')
    

    Пока x является вектором, он будет транслироваться против матрицы строк (0:d)'.

    Вы можете получить результат транспонирования, переведя x вместо диапазона 0:d.

  • Использование двумерного понимания массива:

    phi(x, d) = [xi.^di for xi in x, di in 0:d]
    

    Это будет работать до тех пор, пока x будет истребимым. Если x является массивом n-d, он будет интерпретироваться так, как если бы он был сначала сплющен.

    Вы можете перенести результат, переключив порядок переменных понимания:

    phi(x, d) = [xi.^di for di in 0:d, xi in x]
    

Ответ 2

Преобразование вывода phi в матрицу можно сделать следующим образом:

   y = hcat(phi(x, 3)...)

или если вы предпочитаете, чтобы векторы были строками, необходим транспонирование:

   y = vcat([x' for x in phi(x, 3)]...)

В качестве альтернативы вы можете преобразовать в матрицу внутри phi, определив ее:

   phi(x, d) = hcat([x.^i for i=0:d]...)

Ответ 3

В более общем смысле вы также можете использовать оператор splat ... с hcat:

X = [[1,2], [3, 4], [5,6]]
hcat(X...)

дает матрицу 2 на 3

1  3  5
2  4  6

Ответ 4

Альтернативой splatting как hcat(X...) является использование reduce

reduce(hcat, X)

Так что, в вашем случае, это поможет

reduce(hcat, phi(x, 3))