为了进行基准比较,我考虑了简单的功能:
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_dealiased
为 true
的条目的所有第三维组件设置为 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/