将数字转换为单元格数组行中的数字序列

时间:2018-01-11 01:24:12

标签: matlab cell-array

我想将[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 个答案:

答案 0 :(得分:3)

您希望对数组进行操作,因此无需先转换为单元格数组。只需使用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)将func应用于由一个或多个Name,Value对参数指定的其他选项。 例如,要返回单元格数组中的输出值,请指定“UniformOutput',false ”。当func返回无法连接到数组的值时,可以将B作为单元格数组返回。您可以将Name,Value对参数与前面任一语法的输入参数一起使用。

答案 1 :(得分:3)

以下是获得所需结果的两种方法:

1.使用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.'))={[]};

答案 2 :(得分:3)

如果一个带有零作为占位符的3乘7数字矩阵就足够了,您可以将1-D solution from here调整为2-D解决方案,如下所示:

#include "A_derived.h"
#include "B_derived.h"

int main(int argc, char** argv) {
    int myInts[] = new int[8];
    float myFloats[] = new float[8];
    float anotherFloat = 1.23;

    A_derived myA;
    B_derived myB(1337, (A_base&)myA);
    myB.setupData(myInts, myFloats, 8);

    myB.callAWithDataArrays();
    myB.callAWithSingleValue(4);

    return 0;
}

结果矩阵:

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);