【问题标题】:Replacement for repmat in MATLAB在 MATLAB 中替换 repmat
【发布时间】:2011-07-09 07:17:39
【问题描述】:

我有一个函数可以多次执行以下循环:

for cluster=1:max(bins), % bins is a list in the same format as kmeans() IDX output
    select=bins==cluster; % find group of values
    means(select,:)=repmat_fast_spec(meanOneIn(x(select,:)),sum(select),1); 
    % (*, above) for each point, write the mean of all points in x that 
    % share its label in bins to the equivalent row of means
    delta_x(select,:)=x(select,:)-(means(select,:)); 
    %subtract out the mean from each point
end

注意到repmat_fast_specmeanOneIn 分别是repmat()mean() 的精简版本,我想知道是否有办法在标记为 (*) 的行中进行分配,从而避免使用 repmat完全。

任何其他关于如何从这件事中挤出性能的想法也将受到欢迎。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    这是避免 REPMAT 的可能改进:

    x = rand(20,4);
    bins = randi(3,[20 1]);
    
    d = zeros(size(x));
    for i=1:max(bins)
        idx = (bins==i);
        d(idx,:) = bsxfun(@minus, x(idx,:), mean(x(idx,:)));
    end
    

    另一种可能性:

    x = rand(20,4);
    bins = randi(3,[20 1]);
    
    m = zeros(max(bins),size(x,2));
    for i=1:max(bins)
        m(i,:) = mean( x(bins==i,:) );
    end
    dd = x - m(bins,:);
    

    【讨论】:

      【解决方案2】:

      在 MATLAB 中加速计算的一个明显方法是制作 MEX 文件。您可以编译 C 代码并执行您想要的任何操作。如果您正在寻找尽可能快的性能,那么将操作转换为自定义 MEX 文件可能是您的最佳选择。

      【讨论】:

        【解决方案3】:

        您可以通过使用ACCUMARRAY 获得一些改进。

        %# gather array sizes
        [nPts,nDims] = size(x);
        nBins = max(bins);
        
        %# calculate means. Not sure whether it might be faster to loop over nDims
        meansCell = accumarray(bins,1:nPts,[nBins,1],@(idx){mean(x(idx,:),1)},{NaN(1,nDims)});
        means = cell2mat(meansCell);
        
        %# subtract cluster means from x - this is how you can avoid repmat in your code, btw.
        %# all you need is the array with cluster means. 
        delta_x = x - means(bins,:);
        

        【讨论】:

          【解决方案4】:

          首先:正确格式化您的代码,用空格包围任何运算符或赋值。我发现您的代码很难理解,因为它看起来像一大堆字符。

          接下来,您可以按照其他响应,自动或手动将代码转换为 C (mex) 或 Java,但在我看来,这是最后的手段。你应该只在你的表现还差一点的时候做这样的事情。另一方面,您的算法没有显示出明显的缺陷。

          但是,在尝试提高性能时,您应该做的第一件事是:配置文件。使用 MATLAB 分析器来确定您的代码的哪一部分导致了您的问题。您需要改进多少才能满足您的期望?如果您不知道:首先确定此边界,否则您将在干草堆中寻找一根针,而这根针可能根本就没有。就运行时间而言,MATLAB 永远不会是最快的孩子,但就某些操作的开发时间而言,它可能是最快的。在这方面,牺牲 MATLAB 的清晰度而不是其他语言(C 甚至 Java)的执行速度可能会被证明是有用的。但在同样的方面,您不妨将所有内容都编写成汇编程序,以从代码中榨取所有性能。

          【讨论】:

            【解决方案5】:

            另一个在 MATLAB 中加快计算速度的明显方法是制作一个 Java 库(类似于 @aardvarkk 的回答),因为 MATLAB 是基于 Java 构建的,并且与用户 Java 库具有很好的集成。

            Java 比 C 更易于接口和编译。在某些情况下它可能比 C 慢,但 Java 虚拟机中的即时 (JIT) 编译器通常可以很好地加快速度。

            【讨论】:

            • 我从未尝试过,但这听起来也是一个非常好的建议。
            猜你喜欢
            • 2014-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-27
            • 1970-01-01
            • 2016-01-13
            • 2010-12-15
            相关资源
            最近更新 更多