применить матрицу рандомизации без цикла для в Matlab - PullRequest
2 голосов
/ 01 февраля 2012

Вопрос о matlab и рандомизации 3d-матрицы относительно строк и столбцов.

У меня есть матрица тревожных сигналов M, и я хочу немного испортить ее, но с некоторым контролем.

Я могу достичь своего желания с помощью цикла for

for j=1:size(M,3)
r=randperm(size(M,1));  
random_M(:,:,j)=M(r,r,j); 
end

Есть ли способ выполнить это без необходимости циклически повторять j?Мне нужно много итераций рандомизации, и я могу позволить себе преимущества индексирования.

Приветствия!

edit: Еще несколько мыслей после комментариев Александру

Я создал функцию, которая рандомизирует сжатый файлверсия M:

function randomMat=randomiseMat(Mat)
[rows,cols]=size(Mat);
r=randperm(rows);
randomMat=Mat(r,r);

затем, используя arrayfun, я, кажется, получаю то, что хочу:

randomM=arrayfun(@(x) randomiseMat(M(:,:,x)),1:size(M,3),'UniformOutput', false)

однако randomM теперь представляет собой массив ячеек размером (1, размер (M), 3)) с каждой ячейкой, содержащей рандомизированный массив.

Есть ли способ сделать это в трехмерной матрице так же, как вход M?

1 Ответ

1 голос
/ 01 февраля 2012

Вы можете вычислить все значения для r за один раз, а затем использовать arrayfun:

[nRows,nCols,nPages] = size(M);
[~,r]=sort(rand(nRows,nPages));

%# you should test on a realistic example whether a for-loop
%# isn't faster here
outCell = arrayfun(@(x) M(r(:,x),r(:,x),x), 1:nPages,'UniformOutput',false);
randomM = cat(3,outCell{:});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...