python - 在Matlab中优化一个 "mask"函数

标签 python matlab optimization numpy benchmarking

为了进行基准比较,我考虑了简单的功能:

function dealiasing2d(where_dealiased, data)
[n1, n0, nk] = size(data);
for i0=1:n0 
    for i1=1:n1
        if where_dealiased(i1, i0)
            data(i1, i0, :) = 0.;
        end
    end
end

它在伪光谱模拟中很有用(其中 data 是复数的 3d 数组)但基本上它对一组图像应用掩码,将一些元素归零 where_dealiased 为真。

我在这个简单的案例中比较了不同语言(以及实现、编译器……)的性能。对于 Matlab,我用 timeit 为函数计时.由于我不想在 Matlab 中标杆我的无知,所以我想用这种语言真正优化这个功能。在 Matlab 中执行此操作的最快方法是什么?

我现在使用的简单解决方案是:

function dealiasing2d(where_dealiased, data)
[n1, n0, nk] = size(data);
N = n0*n1;
ind_zeros = find(reshape(where_dealiased, 1, []));
for ik=1:nk
    data(ind_zeros + N*(ik-1)) = 0;
end

我怀疑这不是正确的方法,因为等效的 Numpy 解决方案大约快 10 倍。

import numpy as np

def dealiasing(where, data):
    nk = data.shape[0]
    N = reduce(lambda x, y: x*y, data.shape[1:])
    inds, = np.nonzero(where.flat)
    for ik in xrange(nk):
        data.flat[inds + N*ik] = 0.

最后,如果有人告诉我类似“当你想在 Matlab 中非常快速地使用特定函数时,你应该像这样编译它:[...]”,我会在基准测试中包含这样的解决方案。


编辑:

在 2 个答案之后,我对这些命题进行了基准测试,似乎没有明显的性能改进。这很奇怪,因为简单的 Python-Numpy 解决方案确实(一个数量级)快得多,所以我仍在寻找更好的 Matlab 解决方案...

最佳答案

如果我理解正确的话,这可以通过 bsxfun 轻松快速地完成。 :

data = bsxfun(@times, data, ~where_dealiased);

这会将 where_dealiasedtrue 的条目的所有第三维组件设置为 0(它将它们乘以 0),其余部分保持原样(将它们乘以 1)。

当然,这假设 [size(data,1) size(data,2]==size(where_dealiased)


您的解决方案linear indexing估计也很快。为了在那里节省一些时间,您可以删除 reshape,因为 find 已经返回线性索引:

ind_zeros = find(where_dealiased);

关于python - 在Matlab中优化一个 "mask"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644866/

相关文章:

c# - 来自 fft 结果的功率谱密度 C#

javascript - 我怎样才能让谷歌的闭包编译器消除属性

android - Genymotion 不会停止优化应用程序

c - 复制BLAS矩阵乘法性能:我可以匹配它吗?

python - 如何向 pyqt 5 gui 添加滚动条?

python - 在键为数字的字典中,如何找到较小但最接近给定数字的键?

python - 分配 css 类以形成从 flask 传递到 jinja 的元素

python - 导入错误: no module named 'Adafruit_DHT'

matlab - 元胞数组和函数句柄

arrays - 获取显示值及其出现次数的数组,制作单独列出值的数组