复数如何使用Shuffle.c索引模式
How to use Shuffle.c index mode for complex numbers
我想使用 Shuffle.c 在三维上打乱一个 3d 数组。
到目前为止,我已经使用 Shuffle(arr,3)
并取得了很好的性能。现在我尝试做同样的事情,但是使用复数数组并得到这个错误:
*** Shuffle[mex]: Use index mode for complex input!
我还没有找到使用索引模式的正确方法。
谢谢。
您是否验证了输入尺寸的更好性能?对于打乱一维的 3D 矩阵,最好不要使用具有上述语法的 MEX 函数。它强制 MATLAB 将整个矩阵复制到 mex 并返回。比较:
arr=rand(100,100,100);
t.mexshuffle=timeit(@()(Shuffle(arr,3)));
t.randperm=timeit(@()arr(:,:,randperm(size(arr,3))));
t.mexindexshuffle=timeit(@()arr(:,:,Shuffle(size(arr,3),'index')));
结果是:
struct with fields:
mexshuffle: 0.0183
randperm: 0.0038
mexindexshuffle: 0.0037
使用带index选项的Shuffle
或者randperm
其实都没有关系,但是直接使用Shuffle
会比较慢。不错的副作用,后两个选项支持复数。
以上代码可能有点难以阅读,这里是建议解决方案的更简洁版本:
P=randperm(size(arr,3)); % Permutation vector, use whichever generator you prefer.
%P=Shuffle(size(arr,3),'index');
arr_out=arr(:,:,P);
我想使用 Shuffle.c 在三维上打乱一个 3d 数组。
到目前为止,我已经使用 Shuffle(arr,3)
并取得了很好的性能。现在我尝试做同样的事情,但是使用复数数组并得到这个错误:
*** Shuffle[mex]: Use index mode for complex input!
我还没有找到使用索引模式的正确方法。 谢谢。
您是否验证了输入尺寸的更好性能?对于打乱一维的 3D 矩阵,最好不要使用具有上述语法的 MEX 函数。它强制 MATLAB 将整个矩阵复制到 mex 并返回。比较:
arr=rand(100,100,100);
t.mexshuffle=timeit(@()(Shuffle(arr,3)));
t.randperm=timeit(@()arr(:,:,randperm(size(arr,3))));
t.mexindexshuffle=timeit(@()arr(:,:,Shuffle(size(arr,3),'index')));
结果是:
struct with fields:
mexshuffle: 0.0183
randperm: 0.0038
mexindexshuffle: 0.0037
使用带index选项的Shuffle
或者randperm
其实都没有关系,但是直接使用Shuffle
会比较慢。不错的副作用,后两个选项支持复数。
以上代码可能有点难以阅读,这里是建议解决方案的更简洁版本:
P=randperm(size(arr,3)); % Permutation vector, use whichever generator you prefer.
%P=Shuffle(size(arr,3),'index');
arr_out=arr(:,:,P);