2015-11-03 34 views
7

我正在优化一些代码,并且找不到比MATLAB更快的方法cell2mat。目前,我的代码cell2mat的多次使用占处理时间的多于15%比cell2mat快得多

我认为它可以比这更快,因为我知道我将传递给函数的单元阵列的结构。

基本上,单元阵列是NxN,其中:

  1. 顶部左(N-1)x(N-1)块包含,在每个小区中,一个6x6双矩阵

  2. 右下(N,N)细胞是MxM双矩阵。

  3. 其它细胞具有正确的尺寸为串联,即:

细胞(1:(N-1),N)6xM双基质,所述细胞是(N,1:(N-1))Mx6矩阵。 (图像添加用于清楚起见,有N=207M=300

enter image description here

随着细胞将总是与双打被填充和始终维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工作纵列错误的结果)我想过使用

递归函数,但它似乎没有去任何地方。

提前致谢!

+0

由于大多数MATLAB内置函数都是MEX文件,并且通常不能通过将该函数的新版本作为m文件编写来提高性能。 – NKN

+0

事情是我认为,知道我传递的输入结构应该可以为这个给定的目的写一个优化函数 – BillBokeey

+0

@NKN你确定'cell2mat'是一个MEX文件吗? – BillBokeey

回答

4

从评论的结论是,没有办法显着提高cell2mat的性能。相反,我会建议一个更好的数据结构。

你写道数据实际上代表了2D矩阵。不要将它分成块,而是将其重新组合成4维矩阵。比方说,你的细胞被称为CM是对应的二维矩阵

%Old Code 
q=C{1,1} 
%Faster way to index the same 
%1) Convert 2D matrix to 4D 
blocksize=6 
M=reshape(M,blocksize,size(M,1)/blocksize,blocksize,size(M,2)/blocksize); 
%2) Index a block 
q=squeeze(M(:,1,:,1)) 

作为重塑基本上采用零时间,你可以切换回2D视图,例如过程的最后一个行/列。如果你想避免转换回来,可以一次索引多个bock。最后一列使用:reshape(M(:,206,:,207:end),6,[])对应于C{206,207}

+0

关于索引的好处,谢谢! – BillBokeey

相关问题