【问题标题】:concatenation of N^2 3x3 matrixes into a 3Nx3N matrix将 N^2 3x3 矩阵串联成 3Nx3N 矩阵
【发布时间】:2011-02-04 12:31:38
【问题描述】:

我有 N^2 个矩阵。 每个都是一个 3x3 矩阵。 将它们连接到 3Nx3N 矩阵的一种方法是编写 A(:,:,i)= # 3x3 matrix i=1:N^2

B=[A11 A12 ..A1N;A21 ...A2N;...] 但是当 N 很大时是一项乏味的工作。 你们提供什么?

【问题讨论】:

标签: matlab matrix


【解决方案1】:

这是一个非常快的单行代码,只使用RESHAPEPERMUTE

B = reshape(permute(reshape(A,3,3*N,N),[2 1 3]),3*N,3*N).';

还有一个测试:

>> N=2;
>> A = rand(3,3,N^2)
A(:,:,1) =
    0.5909    0.6571    0.8082
    0.7118    0.6090    0.7183
    0.4694    0.9588    0.5582
A(:,:,2) =
    0.1791    0.6844    0.6286
    0.4164    0.4140    0.5833
    0.1380    0.1099    0.8970
A(:,:,3) =
    0.2232    0.2355    0.1214
    0.1782    0.6873    0.3394
    0.5645    0.4745    0.9763
A(:,:,4) =
    0.5334    0.7559    0.9984
    0.8454    0.7618    0.1065
    0.0549    0.5029    0.3226

>> B = reshape(permute(reshape(A,3,3*N,N),[2 1 3]),3*N,3*N).'
B =
    0.5909    0.6571    0.8082    0.1791    0.6844    0.6286
    0.7118    0.6090    0.7183    0.4164    0.4140    0.5833
    0.4694    0.9588    0.5582    0.1380    0.1099    0.8970
    0.2232    0.2355    0.1214    0.5334    0.7559    0.9984
    0.1782    0.6873    0.3394    0.8454    0.7618    0.1065
    0.5645    0.4745    0.9763    0.0549    0.5029    0.3226

【讨论】:

  • 我可以确认这比 +1 快了一个数量级
【解决方案2】:

试试下面的代码:

N = 4;
A = rand(3,3,N^2);                     %# 3-by-3-by-N^2

c1 = squeeze( num2cell(A,[1 2]) );
c2 = cell(N,1);
for i=0:N-1
    c2{i+1} = cat(2, c1{i*N+1:(i+1)*N});
end

B = cat(1, c2{:});                     %# 3N-by-3N

【讨论】:

    【解决方案3】:

    涉及mat2cellreshape的另一种可能性

    N = 2;
    A = rand(3,3,N^2);  
    
    C = mat2cell(A,3,3,ones(N^2,1));
    C = reshape(C,N,N)'; %'# make a N-by-N cell array and transpose
    
    %# catenate into 3N-by-3N cell array
    B = cell2mat(C);
    

    如果你更喜欢的话,这里是相同的一行

    B = cell2mat(reshape(mat2cell(A,2,2,ones(N^2,1)),N,N)');
    

    对于 N=2

    >> A = rand(3,3,N^2)
    A(:,:,1) =
          0.40181      0.12332      0.41727
         0.075967      0.18391     0.049654
          0.23992      0.23995      0.90272
    A(:,:,2) =
          0.94479      0.33772       0.1112
          0.49086      0.90005      0.78025
          0.48925      0.36925      0.38974
    A(:,:,3) =
          0.24169      0.13197      0.57521
          0.40391      0.94205      0.05978
         0.096455      0.95613      0.23478
    A(:,:,4) =
          0.35316     0.043024      0.73172
          0.82119      0.16899      0.64775
         0.015403      0.64912      0.45092
    
    B =
          0.40181      0.12332      0.41727      0.94479      0.33772       0.1112
         0.075967      0.18391     0.049654      0.49086      0.90005      0.78025
          0.23992      0.23995      0.90272      0.48925      0.36925      0.38974
          0.24169      0.13197      0.57521      0.35316     0.043024      0.73172
          0.40391      0.94205      0.05978      0.82119      0.16899      0.64775
         0.096455      0.95613      0.23478     0.015403      0.64912      0.45092
    

    【讨论】:

      【解决方案4】:

      为什么不使用老式的预分配和循环呢?应该很快。

      N = 4;
      A = rand(3,3,N^2);  % Assuming column major order for Aij
      8
      B = zeros(3*N, 3*N);
      for j = 1:N^2
          ix = mod(j-1, N)*3 + 1;
          iy = floor((j-1)/N)*3 + 1;
          fprintf('%02d - %02d\n', ix, iy);
          B(ix:ix+2, iy:iy+2) = A(:,:,j);
      end
      

      编辑:这里是速度迷的排名:

      N = 200;
      A = rand(3,3,N^2);  % test set
      
      @gnovice solution: Elapsed time is 0.013069 seconds.
      @Amro    solution: Elapsed time is 0.203308 seconds.
      @Rich C  solution: Elapsed time is 0.887077 seconds.
      @Jonas   solution: Elapsed time is 7.065174 seconds.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多