Генерация векторов из отдельных значений в Matlab

#arrays #matlab

#массивы #matlab

Вопрос:

У меня есть вектор c:

 c = [2 5 3];
 

Я хочу генерировать векторы с их длиной, равной каждому значению c в последовательном порядке. Итак, я должен получить 3 вектора:

 c1 = [1 2]; 
c2 = [3 4 5 6 7];
c3 = [8 9 10]; 
 

Затем я хочу выровнять эти векторы в массиве ячеек размером 1×3:

 out = {c1 c2 c3}; 
 

Это может показаться простым, но я не могу понять, как это сделать автоматически. Есть идеи?

Ответ №1:

Вы могли бы использовать mat2cell для достижения этой цели. Сначала мы создаем массив от 1 до sum(c) , а затем используем mat2cell для группировки массива на части, где каждая часть равна размеру каждого элемента c .

 out = mat2cell(1:sum(c), 1, c);
 

Это уменьшает потребность в промежуточных переменных и напрямую предоставляет вам массив ячеек.

 out{1} =

     1     2

out{2} =

     3     4     5     6     7

out{3} =

     8     9    10
 

Комментарии:

1. Почему не намного проще out = accumarray(sum(bsxfun(@gt, 1:sum(c), cumsum(c(:))),1).' 1, 1:sum(c), [], @(x){x.'}) ? 😛

2. @LuisMendo Или версия MATL