Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 比cell2mat跑得快_Matlab_Cell - Fatal编程技术网

Matlab 比cell2mat跑得快

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

我目前正在优化一些代码,无法找到比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=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矩阵
    矩阵,通常比单元格快。不,您不需要删除问题。(在我看来)这是一个好问题(尽管有可能改进)。我的最后一个建议是认真考虑为什么你首先以这样的方式存储数据,如果有另一种形式,你可以使用不使用单元格。