У меня есть матрица данных 3xN, например:
x = [1,2,3; 4,5,6; 7,8,9]
I wi sh, чтобы преобразовать ее в вектор векторов 1xN, где каждая строка представляет собой вектор, например
y = [[1,2,3]; [4,5,6]; [7,8,9]]
Как бы я совершил sh это?
num2cell делает именно это:
num2cell
y = num2cell(x, 2); % specify 2nd dimension
В результате получается массив ячеек векторов:
>> x = [1,2,3; 4,5,6; 7,8,9]; >> y = num2cell(x, 2) y = 3×1 cell array {1×3 double} {1×3 double} {1×3 double} >> celldisp(y) y{1} = 1 2 3 y{2} = 4 5 6 y{3} = 7 8 9
В MATLAB матрицы (или числа c векторов, поскольку они одного типа) могут иметь только скалярные элементы, как в вашем примере x.
x
Для достижения y вам нужно использовать массив ячеек, который можно создать с помощью arrayfun:
y
arrayfun
>> y = arrayfun( @(ii) x(ii,:), 1:size(x,1), 'uni', 0 ); y = {[1 2 3], [4 5 6], [7 8 9]};
Теперь вам нужно индексировать с помощью фигурных скобок, таких как y{1} для [1 2 3]. Обратите внимание, что теперь вы не можете воспользоваться векторизацией, которую исходная матрица могла предложить для любых математических операций, которые будут выполняться позже в вашем коде.
y{1}
[1 2 3]
Элементы вектора или матрицы по определению являются скалярами, вектор векторов в matlab невозможен. Вместо этого вы можете использовать массив ячеек векторов {[1,2,3];[4,5,6];[7,8,9]}
{[1,2,3];[4,5,6];[7,8,9]}