将数字转换为元胞数组行中的数字序列
Convert numbers to sequence of numbers in cell-array rows
我想将 [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]}
您想对数组进行操作,因此无需先转换为元胞数组。只需使用 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
来自 documentation...
B = arrayfun(___,Name,Value) applies func with additional options specified by one or more Name,Value pair arguments. For example, to return output values in a cell array, specify 'UniformOutput',false. You can return B as a cell array when func returns values that cannot be concatenated into an array. You can use Name,Value pair arguments with the input arguments of either of the previous syntaxes.
这里有两种方法可以得到想要的结果:
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.A 矢量化解决方案。
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 solution from here 调整为二维解决方案,如下所示:
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
我想将 [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]}
您想对数组进行操作,因此无需先转换为元胞数组。只需使用 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
来自 documentation...
B = arrayfun(___,Name,Value) applies func with additional options specified by one or more Name,Value pair arguments. For example, to return output values in a cell array, specify 'UniformOutput',false. You can return B as a cell array when func returns values that cannot be concatenated into an array. You can use Name,Value pair arguments with the input arguments of either of the previous syntaxes.
这里有两种方法可以得到想要的结果:
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.A 矢量化解决方案。
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 solution from here 调整为二维解决方案,如下所示:
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