复数如何使用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);