在Matlab中创建一个单元格的每个部分有两个数量的单元格

时间:2013-03-21 11:10:42

标签: matlab matrix

假设我有两个矩阵,如下所述:

A =  17    33    49    65    81    97   113   129   145   161   177

B =  31    57    83   109   135

我想将它们放在这样的单元格中:

[31, 17]      [57, 17]       [83, 17]      [109, 17]     [135, 17]
[31, 33]      [57, 33]       [83, 33]      [109, 33]     [135, 33]
[31, 49]      [57, 49]       [83, 49]      [109, 49]     [135, 49]
[31, 65]      [57, 65]       [83, 65]      [109, 65]     [135, 65]
[31, 81]      [57, 81]       [83, 81]      [109, 81]     [135, 81]
[31, 97]      [57, 97]       [83, 97]      [109, 97]     [135, 97]
[31, 113]     [57, 113]      [83, 113]     [109, 113]    [135, 113]
[31, 129]     [57, 129]      [83, 129]     [109, 129]    [135, 129]
[31, 145]     [57, 145]      [83, 145]     [109, 145]    [135, 145]
[31, 161]     [57, 161]      [83, 161]     [109, 161]    [135, 161]
[31, 177]     [57, 177]      [83, 177]     [109, 177]    [135, 177]

我怎样才能在Matlab中用C代码做到这一点?

2 个答案:

答案 0 :(得分:0)

output = zeros(length(A)*length(B),2);
for i=1:length(B)
  for j=1:length(A)
     output(length(A)*(i-1)+j,:) = [B(i) A(j)];
  end
end

答案 1 :(得分:0)

原生MATLAB解决方案

meshgrid有时可用于生成来自不同集合的所有可能值对的列表:

[X, Y] = meshgrid(B, A);
C = reshape(arrayfun(@horzcat, X(:), Y(:), 'Uniform', 0), numel(A), numel(B));

C保存您正在寻找的结果。

实施例

让我们为以下AB做一个示例:

A = [10 20 30 40];
B = [1 2 3];

meshgrid的目的是创建一个矩阵,该矩阵沿着维度复制向量。因此,向量B沿第一维复制,A沿第二维复制。 [X, Y] = meshgrid(B, A)的结果是:

X =
    10    20    30    40
    10    20    30    40
    10    20    30    40


Y =
     1     1     1     1
     2     2     2     2
     3     3     3     3

两个载体都是重复的,以产生相同尺寸的矩阵。

关于X(:),这意味着X被转换为列向量,逐列连接。因此X(:)会产生[10; 10; 10; 20; 20; 20; 30; 30; 30; ...]。这同样适用于Y(:)

现在棘手的部分:arrayfun分别对输入向量中的每个元素应用一个函数(在这种情况下为horzcat,这仅表示水平串联)。在我们的例子中,有两个输入向量X(:)Y(:),因此arrayfun在每对应的元素上应用horzcat,最终生成{{1}的所有可能组合}和X
此外,由于每个连接结果都是一个向量(包含两个值),因此Y的输出必须是一个单元格数组,因此必须将名为“UniformOutput”的标志设置为false。 我建议您在the official documentation中详细了解arrayfun,以便更好地了解它。

最后一部分是arrayfun,它调整输出单元格数组的尺寸以匹配示例中的尺寸(行数与reshape的长度相匹配,列数与长度相匹配A)。

希望这会稍微解决这个问题。