我想使用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
将Shuffle
与index选项或randperm
一起使用并不重要,但直接使用Shuffle
的速度较慢。副作用不错,后面的两个选项支持复数。
上面的代码可能有点难以阅读,这里是建议解决方案的更干净版本:
P=randperm(size(arr,3)); % Permutation vector, use whichever generator you prefer.
%P=Shuffle(size(arr,3),'index');
arr_out=arr(:,:,P);