Matlab:从连接生成唯一矩阵



假设我有一个简单的2D阵列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来实现这一点。

我知道网格将提供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子矩阵是我正在寻找的唯一矩阵中的1个,然后根据需要提取每个矩阵。

谢谢!

这里有一个使用repmatpermute的替代方案,它可以构建一个三维矩阵,使每个二维平面都是一个组合:

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

也许你可以像下面的一样尝试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
....

相关内容

  • 没有找到相关文章

最新更新