Вектора разных размеров в Matlab записать в одну матрицу с использованием цикла
Есть код, например :
U = sin(0.3*(1:500));
n = length(U);
for t = 1:length(U)
Q = U(t+1:n);
end
Размер вектора U меняется с каждым i. выполнять операции над каждым вектором в цикле я могу, например:
for t = 1:length(U)
Q = U(t+1:n);
S (t) = sum(Q);
end
Однако у меня возникает необходимость записать каждый вектор в матрицу или извлечь, для дальнейших операций над ним. Если в матрицу записать "Лишние " элементы можно дополнить нулями, например
[1 0 0 0 0;
1 2 0 0 0;
1 2 3 0 0 ;
. . . . ]
Кто может подсказать как извлечь или записать в матрицу. Заранее спасибо!
Ответы (2 шт):
Записать в матрицу можно так:
M=[]; % В начале матрица пустая
for t = 1:length(U)
Q = U(t+1:n);
M(t,1:length(Q)) = Q;
end
Строка M(t,1:length(Q)) = Q; означает, что в строку t и столбцы с первого по length(Q) надо записать строку Q. Извлечь можно аналогично:
Q = M(t,1:dl);
где dl - длина извлекаемой части строки. Если нужно извлечь всю строку, то можно так:
Q = M(t,:);
Конечно, с векторами разных размеров лучше работать, записав их в массив ячеек. Но раз вам это не подходит, то можно дополнить матрицу нулями, только, судя по коду, у вас должна получиться верхняя, а не нижняя треугольная матрица.
U = sin(0.3*(1:500));
Q=triu(repmat(U(2:end),length(U)-1,1));
S=sum(Q,2);
Кстати, почему вы решили, что массив ячеек занимает больше памяти? Я тут проверил, массив ячеек занимает меньше места, чем получившаяся верхняя треугольная матрица. Поэтому привожу ещё код с массивом ячеек:
U = sin(0.3*(1:500));
n=length(U);
QC=arrayfun(@(x)U(x:n),2:n,'UniformOutput',false);
S=cellfun(@sum,QC);
Можете потом выполнить команды whos Q и whos QC, посмотреть, сколько байт занимают эти массивы, и убедиться, что массив ячеек занимает меньше памяти.