我有一个大小为 m x 1 的元胞数组,每个元胞也是 s x t 元胞数组(大小各不相同)。我想垂直连接。代码如下:
function(cell_out) = vert_cat(cell_in)
[row,col] = cellfun(@size,cell_in,'Uni',0);
fcn_vert = @(x)([x,repmat({''},size(x,1),max(cell2mat(col))-size(x,2))]);
cell_out = cellfun(fcn_vert,cell_in,'Uni',0); % Taking up lot of time
cell_out = vertcat(cell_out{:});
end
第 3 步需要很长时间。这是正确的做法还是有其他更快的方法来实现这一目标?
cellfun
被发现是slower than loops (有点旧,但同意我所看到的)。此外,repmat
过去也曾影响性能(尽管现在可能有所不同)。试试这个旨在完成您的任务的双循环代码:
function cellOut = vert_cat(c)
nElem = length(c);
colPad = zeros(nElem,1);
nRow = zeros(nElem,1);
for k = 1:nElem
[nRow(k),colPad(k)] = size(c{k});
end
colMax = max(colPad);
colPad = colMax - colPad;
cellOut = cell(sum(nRow),colMax);
bottom = cumsum(nRow) - nRow + 1;
top = bottom + nRow - 1;
for k = 1:nElem
cellOut(bottom(k):top(k),:) = [c{k},cell(nRow(k),colPad(k))];
end
end
我对这段代码的测试是
A = rand(20,20);
A = mat2cell(A,ones(20,1),ones(20,1));
C = arrayfun(@(c) A(1:c,1:c),randi([1,15],1,5),'UniformOutput',false);
ccat = vert_cat(c);
我是一名优秀的程序员,十分优秀!