Как преобразовать массив массива в матрицу?
Предположим, что я хочу применить вектор-функцию 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))