如何在单元格数组中混洗行

时间:2015-02-05 16:07:05

标签: matlab

我有一个x列的单元格数组,每个列都有一个yx1单元格。我想随机排列"行"在列内。也就是说,对于具有元素a_1,a_2,... a_y的每个yx1单元格,我想将相同的置换应用于a_i的索引。

我有一个能够做到这一点的功能,

function[Oarray] = shuffleCellArray(Iarray);

    len   = length(Iarray{1});
    width = length(Iarray);
    perm  = randperm(len);

    Oarray=cell(width, 0);

    for i=1:width;
        for j=1:len;
            Oarray{i}{j}=Iarray{i}{perm(j)};
        end;
    end;

但是你可以看到它有点难看。有更自然的方法吗?

我意识到我可能使用了错误的数据类型,但由于遗留原因,我希望避免切换。但是,如果答案是"切换"那我觉得这就是答案。

1 个答案:

答案 0 :(得分:3)

我假设您有一个列向量的单元格数组,例如

Iarray = {(1:5).' (10:10:50).' (100:100:500).'};

在这种情况下,你可以这样做:

ind = randperm(numel(Iarray{1})); %// random permutation
Oarray = cellfun(@(x) x(ind), Iarray, 'UniformOutput', 0); %// apply that permutation
                                                           %//  to each "column"

或转换为中间矩阵然后返回到单元格数组:

ind = randperm(numel(Iarray{1})); %// random permutation
x = cat(2,Iarray{:}); %// convert to matrix
Oarray = mat2cell(x(ind,:), size(x,1), ones(1,size(x,2))); %// apply permutation to rows
                                                           %// and convert back