Преобразовать числа в последовательность чисел в строках массива ячеек

Я хочу конвертировать [5,3,7] в массив ячеек, где каждая строка будет в диапазоне от '1:to_the_respective_number". Однако это кажется удивительно трудным для достижения. Может кто-нибудь указать, где я ошибся?

nums=[5,3,7];
cellfun(@(x) 1:x, num2cell(nums),'UniformOutput',0)

ans =
  1×3 cell array
    {1×5 double}    {1×3 double}    {1×7 double}

то, что я на самом деле хотел получить это (слип это в проводнике переменных)

{1,2,3,4,5,[],[];1,2,3,[],[],[],[];1,2,3,4,5,6,7}
ans =
  3×7 cell array
    {[1]}    {[2]}    {[3]}    {[       4]}    {[       5]}    {0×0 double}    {0×0 double}
    {[1]}    {[2]}    {[3]}    {0×0 double}    {0×0 double}    {0×0 double}    {0×0 double}
    {[1]}    {[2]}    {[3]}    {[       4]}    {[       5]}    {[       6]}    {[       7]}

3 ответа

Решение

Вот два способа получить желаемый результат:

1.Using arrayfun,

nums=[5,3,7];
m = max(nums);
row  = arrayfun(@(x){[num2cell(1:x) cell(1, m-x)]}, nums );
result = vertcat(row{:});

2.Векторное решение.

nums=[5,3,7];
m = max(nums);  
result = repmat(num2cell(1:m),numel(nums),1);
result(bsxfun(@gt, 1:m , nums.'))={[]};

Если числовой матрицы 3 на 7 с нулями в качестве заполнителей достаточно, вы можете адаптировать 1-D решение отсюда в 2-D решение следующим образом:

nums = [5 3 7];
N = numel(nums);
maxNum = max(nums);
index = nums.*N+(1:3);

res = [ones(N, 1) zeros(N, maxNum)];
res(index) = -1;
res = cumsum(res, 2);
res(index) = -nums;
res = cumsum(res(:, 1:maxNum), 2);

И полученная матрица:

res =

     1     2     3     4     5     0     0
     1     2     3     0     0     0     0
     1     2     3     4     5     6     7

Вы хотите работать с массивом, поэтому нет необходимости сначала преобразовывать его в массив ячеек. Просто используйте arrayfun(___, 'UniformOutput', false).

>> nums = [5,3,7];
>> res = arrayfun(@(x) 1:x, nums, 'UniformOutput', false);

Результат

>> res{:}
ans =
     1     2     3     4     5
ans =
     1     2     3
ans =
     1     2     3     4     5     6     7

Из документации...

B = arrayfun (___, Name,Value) применяет func с дополнительными параметрами, указанными одним или несколькими аргументами Name,Value value. Например, чтобы вернуть выходные значения в массиве ячеек, укажите "UniformOutput", false. Вы можете вернуть B как массив ячеек, когда func возвращает значения, которые нельзя объединить в массив. Вы можете использовать Name,Value пары аргументов с входными аргументами любого из предыдущих синтаксисов.

Другие вопросы по тегам