Matlab 比cell2mat跑得快
我目前正在优化一些代码,无法找到比MATLAB的Matlab 比cell2mat跑得快,matlab,cell,Matlab,Cell,我目前正在优化一些代码,无法找到比MATLAB的cell2mat更快的方法。目前,在我的代码中多次使用cell2mat占处理时间的15%以上 我认为它可以更快,因为我知道我将传递给函数的单元数组的结构 基本上,单元阵列是NxN,其中: 左上角的(N-1)x(N-1)块在每个单元格中包含一个6x6双矩阵 右下角的(N,N)单元格是一个MxM双矩阵 其他单元格具有正确的连接尺寸,即: 单元(1:(N-1),N)是6xM双矩阵,单元(N,1:(N-1))是Mx6双矩阵。(为清晰起见添加的图像,有N=2
cell2mat
更快的方法。目前,在我的代码中多次使用cell2mat
占处理时间的15%以上
我认为它可以更快,因为我知道我将传递给函数的单元数组的结构
基本上,单元阵列是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];
但它没有及时显示出任何改进。。(当重塑
按列操作时,给出错误结果)
我也考虑过使用递归函数,但它似乎没有什么用处
提前谢谢 从评论中得出的结论是,没有办法显著提高
cell2mat
的性能。相反,我建议使用更好的数据结构
您写道,数据实际上表示二维矩阵。与其将其拆分为块,不如更快地将其重塑为4D矩阵。假设您的单元格被称为C
,M
是相应的2D矩阵
%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))
由于重塑基本上不需要时间,因此可以切换回二维视图,例如处理最后一行/列。如果您想避免转换回来,可以一次索引多个块。对于最后一列,请使用:
reformate(M(:,206,:,207:end),6,[])
,它对应于C{206207}
因为大多数MATLAB内置函数都是MEX文件,通常无法通过将该函数的新版本作为m文件编写来提高性能。实际上,有趣的是,您的代码与cell2mat
的代码非常相似,无需进行错误检查cell2mat
针对2D单元格进行了优化,因此我认为您不会得到太多的加速。@NKN那些实现为.m
的文件可以使用edit cell2mat
查看。那些实现为内置(C)函数的函数会说它们是内置的,您将无法查看它们的源代码。或者您可以重新考虑您的数据结构。内部(N-1)x(N-1)
可以存储为4D矩阵
矩阵,通常比单元格快。不,您不需要删除问题。(在我看来)这是一个好问题(尽管有可能改进)。我的最后一个建议是认真考虑为什么你首先以这样的方式存储数据,如果有另一种形式,你可以使用不使用单元格。