Как перемешать в указанном измерении c в многомерном массиве комплексных чисел - PullRequest
2 голосов
/ 07 апреля 2020

Я хочу перетасовать трехмерный массив со сложными значениями таким образом, чтобы элементы случайным образом переставлялись только по 3-му измерению.

Например, трехмерный массив из целых чисел A (напоминаю, что я ищу то же решение, но для сложного массива чисел):

A(:,:1)= 1 2 3 ; 4 5 6 ; 7 8 9
A(:,:2)= 10 11 12; 13 14 15 ; 16 17 18

После перетасовки третьего измерения возможный вывод может быть:

A(:,:1)= 10 2 3 ; 4 14 6 ; 7 17 18
A(:,:2)= 1 11 12; 13 5 15 ; 16 8 9

Как я могу это сделать?

Единственное решение , которое я обнаружил, включает в себя скомпилированную функцию c, которая не работает с массивом со комплексными значениями.

Ответы [ 3 ]

3 голосов
/ 07 апреля 2020

Вы можете очень просто перебрать первые два измерения и переставить элементы вдоль третьего:

a = randn(3,5,2) + 1i*randn(3,5,2); % some complex data

for jj=1:size(a,2)
  for ii=1:size(a,1)
    a(ii,jj,:) = a(ii,jj,randperm(size(a,3)));
  end
end

Обратите внимание, что это решение, вероятно, быстрее, чем решение cellfun в другом ответе для очень большие массивы, так как это решение требует хранения и использования больших промежуточных данных.

3 голосов
/ 08 апреля 2020

Вот векторизованный способ:

A = cat(3, [1 2 3; 4 5 6; 7 8 9], [10 11 12; 13 14 15; 16 17 18]); % define data
s = size(A); % get size of A
[~, ind] = sort(rand(s), 3); % indices of random permutations along 3rd dim
result = A(reshape(1:s(1)*s(2),s(1),s(2)) + (ind-1)*s(1)*s(2)); % linear index and result
1 голос
/ 07 апреля 2020

приведенный ниже скрипт выполняет случайное перемешивание в 3-м измерении,

% creating a sample data, can be complex numbers
x=magic(10);
x=reshape(x,[4,5,5]);

% split 3D matrix into 2D cell arrays of vectors, permute those, and get back to 3D
y=num2cell(x,3);
newy=cellfun(@(x) x(randperm(length(x))), y,'uni',false);
newx=cell2mat(newy);

вы можете вызвать permute, а затем num2cell, чтобы разделить ваш 3D-массив различными способами, чтобы перемешать его в другом измерении Например,

x=permute(x,[2,3,1]);
y=num2cell(x,3);

приведенный выше код создаст массивы ячеек 5x5 векторов из 4 элементов (т. е. 1-го измерения), затем вы можете использовать cellfun/cell2mat, чтобы выполнить случайное перемешивание 1-го измерения , затем снова вызовите permute, чтобы изменить его на исходный порядок размеров.

...