gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:33 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com