假设我有一个简单的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个,然后根据需要提取每个矩阵。
谢谢!
这里有一个使用repmat
和permute
的替代方案,它可以构建一个三维矩阵,使每个二维平面都是一个组合:
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
....