我有一个69x1
单元格数组。每行包含3列double,但行数可变。
例如,每行都有;
4x3双倍 13x3双倍 ......等等。
我使用;
将单元格数组中的所有数据提取到一个矩阵中result = vertcat(data{:})
我想要做的是根据数据单元阵列中从哪个单元格中提取出一个标识。例如,从数据单元阵列中的第一行提取的4行将在它们前面有1个...所以我会得到类似的东西;
1,x,y,z
1,x,y,z
1,x,y,z
1,x,y,z (as row 1 in data has 4 rows)
2,x,y,z
2,x,y,z (for the 13 rows)
答案 0 :(得分:2)
这是一种方式:
data = { rand(2,3);
rand(5,3) }
%// create identity vector
out1 = cell2mat(arrayfun(@(x) x.*ones(1,size(data{x},1)), 1:numel(data),'uni',0)).' %'
%// convert data from cell to double matrix
out2 = cell2mat(data)
%// concatenate output
out = [ out1 , out2 ]
或直接
out = cell2mat([arrayfun(@(x)x.*ones(1,size(data{x},1)).',1:numel(data),'uni',0).',data])
或更多花哨,成本更低(未经测试):
%// create identity vector
A(cumsum([1; cellfun(@(x) size(x,1),data)])) = 1
%// concatenate output
out = [cumsum(A(1:end-1)).' cell2mat(data)]
给出:
data =
[2x3 double]
[5x3 double]
out =
1 0.88441 0.018613 0.43851
1 0.72086 0.67478 0.43782
2 0.11704 0.37569 0.51537
2 0.81468 0.54655 0.65753
2 0.32486 0.56192 0.95092
2 0.24623 0.39582 0.72235
2 0.34271 0.39813 0.40008