我正在优化一些代码,并且找不到比MATLAB更快的方法cell2mat
。目前,我的代码中cell2mat
的多次使用占处理时间的多于15%。比cell2mat快得多
我认为它可以比这更快,因为我知道我将传递给函数的单元阵列的结构。
基本上,单元阵列是NxN
,其中:
顶部左
(N-1)x(N-1)
块包含,在每个小区中,一个6x6
双矩阵右下
(N,N)
细胞是MxM
双矩阵。其它细胞具有正确的尺寸为串联,即:
细胞(1:(N-1),N)
是6xM
双基质,所述细胞是(N,1:(N-1))
双Mx6
矩阵。 (图像添加用于清楚起见,有N=207
和M=300
)
随着细胞将总是与双打被填充和始终维2的,我已经仅使用小片的cell2mat
代码,即:
function m = myCell2Mat(c)
rows = size(c,1);
m = cell(rows,1);
% Concatenate one dim first
for n=1:rows
m{n} = cat(2,c{n,:});% 73% of the time spent here
end
% Now concatenate the single column of cells into a matrix
m = cat(1,m{:});% 25.2% of the time spent there
end
该好好尝试一下改变所花的时间多(像人们可以想像),大部分时间都花在了这些行。
我的问题是:有没有人有关于如何去除那里的循环的想法?我试图沿着线的东西:
N=207;
M=300;
C=cell(N,N);
for ii=1:N-1
for jj=1:N-1
C{ii,jj}=rand(6);
end
end
for kk=1:(N-1)
C{N,kk}=rand(M,6);
C{kk,N}=rand(6,M);
end
C{end}=rand(M,M);
tmp1=cat(1,C{:,1:(end-1)});
LeftPart=reshape(tmp1,[],6*(size(C,2)-1));
RightPart=cat(1,C{:,end});
Res=[LeftPart RightPart];
不过,这并不表明在任何时间改良效果..(并为reshape
工作纵列错误的结果)我想过使用
递归函数,但它似乎没有去任何地方。
提前致谢!
由于大多数MATLAB内置函数都是MEX文件,并且通常不能通过将该函数的新版本作为m文件编写来提高性能。 – NKN
事情是我认为,知道我传递的输入结构应该可以为这个给定的目的写一个优化函数 – BillBokeey
@NKN你确定'cell2mat'是一个MEX文件吗? – BillBokeey