【问题标题】:Permuting columns of a matrix in MATLAB在 MATLAB 中置换矩阵的列
【发布时间】:2016-05-03 04:20:26
【问题描述】:

假设我有一个n by d 矩阵A,我想置换某些列的条目。为此,我将1 ... n 的排列计算为

idx1 = randperm(n)'
idx2 = randperm(n)'

那么我可以这样做:

A(:,1) = A(idx1,1)
A(:,2) = A(idx2,2)

但是,我不想使用for-loop 来执行此操作,因为它会很慢。假设我有一个n by d 矩阵A 和一个指定排列的n by d 索引矩阵IDX,是否有更快的等效于以下for-loop:

for i = 1:d
    A(:,i) = A(IDX(:,i),i);
end

【问题讨论】:

    标签: matlab matrix random permutation vectorization


    【解决方案1】:

    bsxfun 的帮助下使用linear-indexing -

    [n,m] = size(A);
    newA = A(bsxfun(@plus,IDX,[0:m-1]*n))
    

    【讨论】:

    • 谢谢,非常好。我想我低估了循环,因为它需要大约相同的处理时间。但是您的解决方案更优雅,bsxfun 再次证明是解决方案。我应该经常检查一下!
    • @EricSchols 是的,是内存访问扼杀了我们。对于 MATLAB,向量化访问并不比循环内存访问快,除非我们正在执行某些操作,在这种情况下,可以将向量化操作与其耦合以提高性能。这是我能够在bsxfun 上进行的一项详细研究:Comparing BSXFUN and REPMAT。它很好地了解了哪些数学运算可以提高性能。
    【解决方案2】:

    我想另一种相当愚蠢的方法是使用cellfun,愚蠢的因为你必须将它转换成一个单元格,然后再将它转换回来,但无论如何它都在那里。

    N=ones(d,1)*n; %//create a vector of d length with each element = n
    M=num2cell(N); %//convert it into a cell
    P=cellfun(@randperm, M,'uni',0); %//cellfun applys randperm to each cell
    res = cell2mat(P); %//Convert result back into a matrix (since results are numeric).
    

    这也允许 Char 和 String 类型的 randperm,但 cell2mat 不适用于这些情况,结果是 Cell Array 格式。

    for d = 5, n = 3:
    >> res =
    
     1     3     2
     1     2     3
     2     3     1
     3     1     2
     3     2     1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多