所以我尝试对您的代码进行一些改进,您可以看到以下结果:
%% My approach to solve the question (it has a slightly better runtime)
function c = myapproach(a, cells)
c = {a.b};
sz = [a.Size];
for i = 1:cells
c{i} = c{i}(1:sz(i));
end
end
虽然这并不能避免 for 循环,但它的运行时间稍好一些。我得到的运行时间(在单元格 = 50000 处)是:@yourapproach = 0.0889, @myapproach = 0.0721, @rahnema1 = 0.2329
以下是我用来解决这个问题的代码。我还对用于生成 a 的代码进行了一些改进(由注释标记)
function solveit()
cells = 50000;
maxVal = 40;
Sizes = randi(maxVal, 1, cells);
a(cells) = struct('Size', 0, 'b', []); %% Improved by preallocating a
for i = 1:cells
a(i).b = rand(1, maxVal); %% Improved by removing the unnecessary double loop
a(i).Size = Sizes(i);
end
fun1 = @() yourapproach(a, cells);
fun2 = @() myapproach(a, cells);
fun3 = @() rahnema1(a);
%% Show runtimes
timeit(fun1)
timeit(fun2)
timeit(fun3)
c1 = fun1();
c2 = fun2();
c3 = fun3();
%%Show approach equivalence
disp(isequal(c1, c2))
disp(isequal(c1, c3))
end
%% Your approach
function c = yourapproach(a, cells)
c = cell(1, cells);
for i = 1:cells
sz = a(i).Size;
c{1,i} = a(i).b(1:sz);
end
end
%% Approach mentioned by rahnema1
function c = rahnema1(a)
cc = struct2cell(a);
sz = [cc{1:2:end}];
sz = [sz;40-sz];
dat = [cc{2:2:end}];
c = mat2cell(dat, 1, sz(:));
c = c(1:2:end);
end
编辑:我正在添加 arrayfun 方法,但它至少比 for 循环慢 10 倍
function c = newapproach(a)
sz = [a.Size];
c = arrayfun(@(x, y) x.b(1:y), a, sz, 'UniformOutput', false);
end