Arrays Matlab:从串联生成唯一矩阵?
假设我有一个简单的2D数组a:Arrays Matlab:从串联生成唯一矩阵?,arrays,matlab,multidimensional-array,Arrays,Matlab,Multidimensional Array,假设我有一个简单的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来实现这一点 我知道meshgrid将提供B和C的所有唯一组合,我可以定义一个函数来分别对a和B,C的一个
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子矩阵都是我正在寻找的唯一矩阵中的一个,然后根据需要提取每个矩阵
谢谢 也许你可以试试下面的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
....
也许你可以试试下面的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
....
以下是使用repmat和permute构建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
以下是使用repmat和permute构建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
arrayfun和celfun是循环。你就是看不见他们。“从几年前开始,MATLAB中的循环速度就很快了。”AnderBiguri我向我的同事解释了这一点,但遗憾的是,我在这里:arrayfun和celfun都是循环。你就是看不见他们。“从几年前开始,MATLAB中的循环速度很快。@AnderBiguri我向同事们解释了这一点,但遗憾的是,我在这里: