Вот одно решение, которое достигнет того же результата, что и ваш цикл for (то есть другая перестановка столбцов для каждой страницы):
%# Solution 1:
[r,c,p] = size(A);
Aperm = reshape(A,r,c*p);
index = arrayfun(@randperm,c.*ones(1,p),'UniformOutput',false);
index = [index{:}]+kron(0:c:c*(p-1),ones(1,c));
Aperm = reshape(Aperm(:,index),r,c,p);
И, как и в случае со многими проблемами в MATLAB, существует множество различных способов решения этой проблемы. Вот еще одно решение, которое позволяет избежать изменения формы матрицы, используя только линейное индексирование в A
:
%# Solution 2:
[r,c,p] = size(A);
Aperm = zeros([r c p]);
index1 = repmat(1:r,1,c*p);
[~,index2] = sort(rand(c,p)); %# A variation on part of Amro's answer
index2 = kron(index2(:),ones(r,1)).'; %'
index3 = kron(1:p,ones(1,r*c));
index = sub2ind([r c p],index1,index2,index3);
Aperm(:) = A(index);