Вектора разных размеров в 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 шт):

Автор решения: AVK

Записать в матрицу можно так:

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, посмотреть, сколько байт занимают эти массивы, и убедиться, что массив ячеек занимает меньше памяти.

→ Ссылка