当前位置:  开发笔记 > 编程语言 > 正文

在MATLAB中交换两个元素的性能

如何解决《在MATLAB中交换两个元素的性能》经验,为你挑选了1个好方法。

纯粹作为一个实验,我在MATLAB中编写排序函数,然后通过MATLAB分析器运行它们.我觉得最令人困惑的方面是交换元素.

我发现在矩阵中交换两个元素的"官方"方式

self.Data([i1, i2]) = self.Data([i2, i1])

运行速度比在四行代码中运行要慢得多:

e1 = self.Data(i1);
e2 = self.Data(i2);
self.Data(i1) = e2;
self.Data(i2) = e1;

第二个示例占用的总时间长度比第一个示例中的单行代码少12倍.

有人会解释为什么?



1> Andrew Sheph..:

根据发布的建议,我进行了一些测试.当分配的LHS和RHS中引用相同的矩阵时,似乎会出现性能损失.

我的理论是MATLAB使用内部引用计数/写时复制机制,这导致整个矩阵在内部被引用时被内部复制.(这是猜测因为我不知道MATLAB的内部结构).

以下是调用函数885548次的结果.(这里的差异是第四次,而不是我最初发布的十二次.每个函数都有额外的函数包装开销,而在我的初始帖子中我只是总结了各个行).

 swap1: 12.547 s
 swap2: 14.301 s
 swap3: 51.739 s

这是代码:

 methods (Access = public)
     function swap(self, i1, i2)
        swap1(self, i1, i2);
        swap2(self, i1, i2);
        swap3(self, i1, i2);
        self.SwapCount = self.SwapCount + 1;
    end
 end

 methods (Access = private)
    %
    % swap1: stores values in temporary doubles
    %         This has the best performance
    %
    function swap1(self, i1, i2)
        e1 = self.Data(i1);
        e2 = self.Data(i2);
        self.Data(i1) = e2;
        self.Data(i2) = e1;
    end

    %
    % swap2: stores values in a temporary matrix
    %        Marginally slower than swap1
    %
    function swap2(self, i1, i2)
        m = self.Data([i1, i2]);
        self.Data([i2, i1]) = m;
    end

    %
    % swap3: does not use variables for storage.
    %        This has the worst performance
    %
    function swap3(self, i1, i2)
        self.Data([i1, i2]) = self.Data([i2, i1]);
    end


end

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有