【问题标题】:Matlab: Unique Matrix Generation from Concatenation?Matlab:从连接中生成唯一矩阵?
【发布时间】:2020-04-02 19:27:53
【问题描述】:

假设我有一个简单的二维数组 A:

A = [0.25 0.3; 0.1 0.5];

我想将第三行与以下向量的每个元素组合连接起来:

B = 0:0.1:1;
C = 0:0.1:1;

制作 121 个独特的矩阵。例如:

A_prime = [0.25 0.3; 0.1 0.5; 0 0];

将是一个这样的矩阵。

如果可能的话,我想避免使用显式的 for 循环,并使用 arrayfun 或 cellfun 来做到这一点。

我知道 meshgrid 将提供 B 和 C 的所有唯一组合,我可以定义一个函数来分别对 A 和 B、C 的元素执行连接。那就是:

[b_mesh, c_mesh] = meshgrid(B,C);
myfun = @(A,b,c) [A; b,c];

但是arrayfun会报错:

arrayfun(myfun, A, b_mesh, c_mesh)

Error using arrayfun
All of the input arguments must be of the same size and shape.
Previous inputs had size 2 in dimension 1. Input #3 has size 11

这是有道理的。那么,是否有类似的实现来生成保持维度一致的所有唯一矩阵?

我的另一个想法是可能生成一个更大的矩阵,其中每个 3x3 子矩阵都是我正在寻找的唯一矩阵之一,然后根据需要提取每个矩阵。

谢谢!

【问题讨论】:

  • arrayfun 和 celfun 循环。你只是看不到他们。自几年前以来,MATLAB 中的循环速度很快。
  • @AnderBiguri 我向我的同事解释了这一点,但可惜我在这里 :)

标签: arrays matlab multidimensional-array


【解决方案1】:

这是使用repmatpermute 的替代方法,它构建一个3d 矩阵,使得每个2d 平面都是一个组合:

A = [0.25 0.3; 0.1 0.5];
[b_mesh, c_mesh] = meshgrid(B,C);
A_prime = [repmat(A, 1, 1, numel(b_mesh)); permute([b_mesh(:), c_mesh(:)], [3 2 1])];

结果:

A_prime =

ans(:,:,1) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.00000

ans(:,:,2) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.10000

ans(:,:,3) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.20000

ans(:,:,4) =

   0.25000   0.30000
   0.10000   0.50000
   0.00000   0.30000

...

可以使用第三个索引检索单个组合:

A_prime(:,:,112)
ans =

   0.25000   0.30000
   0.10000   0.50000
   1.00000   0.10000

【讨论】:

    【解决方案2】:

    也许你可以试试meshgrid + cellfun 如下所示

    [b,c] = meshgrid(B,C);
    Z = [b(:),c(:)];
    A_primes = cellfun(@(x) [A;x], mat2cell(Z,ones(1,size(Z,1)),size(Z,2)),'UniformOutput', false);
    

    这样

    >> A_primes
    A_primes =
    {
      [1,1] =
    
         0.25000   0.30000
         0.10000   0.50000
         0.00000   0.00000
    
      [2,1] =
    
         0.25000   0.30000
         0.10000   0.50000
         0.00000   0.10000
    
      [3,1] =
    
         0.25000   0.30000
         0.10000   0.50000
         0.00000   0.20000
    
      [4,1] =
    
         0.25000   0.30000
         0.10000   0.50000
         0.00000   0.30000
    
      [5,1] =
    
         0.25000   0.30000
         0.10000   0.50000
         0.00000   0.40000
    
      [6,1] =
    
         0.25000   0.30000
         0.10000   0.50000
         0.00000   0.50000
    
    ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多