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

предположим, я хочу применить векторную функцию 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}, т. е. массив массивов. На самом деле, я хочу!--3--> для матрицы. Реализация phi не так? Или как его преобразовать?

спасибо!

3 ответов


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

  1. через вещание:

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

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

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

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

    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]
    

преобразование 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]...)

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

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

дает 2-на-3 матрицы

1  3  5
2  4  6