0

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

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 代码做到这一点?

4

2 回答 2

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
于 2013-03-21T11:20:10.037 回答
0

原生 MATLAB 解决方案

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

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

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

例子

让我们为以下A和做一个例子B

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于每对对应的元素,最终产生X和的所有可能组合Y
此外,由于每个连接结果都是一个向量(包含两个值),因此 的输出arrayfun必须是一个元胞数组,因此必须将名为“UniformOutput”的标志设置为 false。
我建议您阅读官方文档中的arrayfun更多内容以更好地理解它。

最后一部分是reshape,它调整输出元胞数组的维度以匹配示例中的维度(行数与 的长度A匹配,列数与 的长度匹配B)。

希望这能稍微澄清一下这个解决方案。

于 2013-03-21T11:26:15.530 回答