Проверяли ли вы лучшую производительность для ваших входных размеров? Для трехмерных матриц, тасующих одно измерение, лучше не использовать функцию 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
с опцией индекса или randperm
, но напрямую используете Shuffle
медленнее. Хороший побочный эффект, более поздние две опции поддерживают комплексные числа.
Над кодом может быть немного трудно читать, здесь более чистая версия предлагаемого решения:
P=randperm(size(arr,3)); % Permutation vector, use whichever generator you prefer.
%P=Shuffle(size(arr,3),'index');
arr_out=arr(:,:,P);