Как использовать индексный режим Shuffle. c для комплексных чисел - PullRequest
3 голосов
/ 14 апреля 2020

Я хочу перемешать трехмерный массив в третьем измерении, используя Перемешать. c. До сих пор я использовал Shuffle(arr,3) с отличной производительностью. Теперь я пытаюсь сделать то же самое, но с массивом комплексных чисел и получаю эту ошибку:

*** Shuffle[mex]: Use index mode for complex input! 

Я не нашел правильный способ использовать режим индекса. Спасибо.

1 Ответ

2 голосов
/ 14 апреля 2020

Проверяли ли вы лучшую производительность для ваших входных размеров? Для трехмерных матриц, тасующих одно измерение, лучше не использовать функцию 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);
...