【问题标题】:merge two matrix and its attributes in matlab在matlab中合并两个矩阵及其属性
【发布时间】:2015-05-18 20:02:10
【问题描述】:

我有两个矩阵 a 和 b,我想将行组合在一起,在第一行中我没有重复值,在第二个值中,a 和 b 中的列具有相同的行值在新矩阵中加在一起。即

a =
 1     2     3
 8     2     5

b =
 1     2     5     7
 2     4     6     1

期望的输出c =

 1     2     3     5     7
10     6     5     6     1

欢迎任何帮助。

【问题讨论】:

  • 合并/合并是什么意思?如果输入矩阵的行/列大小不同会怎样?
  • 在示例中,列的大小是任意的。第一行是键,我希望这一行的值不重复(例如通过 union(a(1,:)),b(1,:))。对于其他行,无论它们的第一行值是否相等,它们都会相加(例如,将 a 中的 8 和 b 中的 2 相加,输出矩阵中小于 1 的值的结果为 10)。

标签: arrays matlab matrix


【解决方案1】:

对于两行矩阵

您想要添加与相同的第一行值对应的第二行值。这是uniqueaccumarray的典型用法:

[ii, ~, kk] = unique([a(1,:) b(1,:)]);
result = [ ii; accumarray(kk(:), [a(2,:) b(2,:)].').'];

一般情况

如果您需要累积具有任意数量的列(基于第一行值),您可以使用sparse,如下所示:

[ii, ~, kk] = unique([a(1,:) b(1,:)]);
r = repmat((1:size(a,1)-1).', 1, numel(kk));
c = repmat(kk.', size(a,1)-1, 1);
result = [ii; full(sparse(r,c,[a(2:end,:) b(2:end,:)]))];

【讨论】:

  • 没错!我终于明白了 accumarray 的含义:)。你能解释一下什么是 ~ 和你的第二行脚本吗?
  • @hamideh ~ 仅表示“忽略该输出”。就像[ii, jj, kk] = unique([a(1,:) b(1,:)]);,但你不需要jj
  • @hamideh 对于第二行,我建议你观察kk(:),然后是[a(2,:) b(2,:)].',然后是accumarray(kk(:), [a(2,:) b(2,:)].')。这将使发生的事情变得很明显:accumarray 将对应于相同第一个输入值的第二个输入值相加
  • 谢谢,如果我们有细胞会发生什么。是否也可以为 cellarray 扩展?
  • 对于两行矩阵:是的,基于accumarray 的方法很容易修改以处理最大值:[ii, ~, kk] = unique([a(1,:) b(1,:)]); result = [ ii; accumarray(kk(:), [a(2,:) b(2,:)].', [], @max).']
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多