我想将[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]}
答案 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);