【问题标题】:Chain elements in matrix using rows使用行链接矩阵中的元素
【发布时间】:2015-09-28 10:49:25
【问题描述】:

我有一个矩阵,其中每一行都是两个数字的组合,例如A = [1 2; 2 5; 3 4; 4 6; 5 6]

A 的构建方式是,对于每一行,第一个元素始终小于第二个元素。

我需要从A 返回链式元素列表(在上面的例子中,链式元素的列表是1 2 5 63 4 6)。这些列表本质上是通过考虑一行来构建的,并且检查最后一个数字是另一行的第一个数字。您对如何执行此操作有任何建议吗?

【问题讨论】:

  • 简单:for 循环。循环遍历每一行,检查条件?添加到链:继续。我将把有效的解决方案留给你。
  • 如果数据中有“循环”怎么办?例如,输入[1 2; 3 4; 2 5; 5 6; 4 3]; 的输出是什么? `
  • @LuisMendo:矩阵的构建使得对于每一行,第一个数字总是小于第二个。但也有像[1 2; 3 4; 2 5; 4 6; 5 6] 这样的案例,我想从中得到两组:1 2 5 63 4 6
  • @albus_c 知道了。您应该在问题中包含它以使其清楚
  • @LuisMendo 好的。我将编辑问题。

标签: arrays matlab list matrix


【解决方案1】:

如果我答对了,假设A作为输入数组,你可以使用bsxfun -

mask = bsxfun(@eq,A(:,1),A(:,2).');
out = unique(A(any(mask,1).' | any(mask,2),:))

示例运行 -

>> A
A =
     1     2
     3     4
     2     5
     5     6
>> mask = bsxfun(@eq,A(:,1),A(:,2).');
>> unique(A(any(mask,1).' | any(mask,2),:))
ans =
     1
     2
     5
     6

你也可以使用ismember,像这样-

out = unique(A(ismember(A(:,1),A(:,2)) | ismember(A(:,2),A(:,1)),:))

第三种选择是使用intersect 来解决它,就像这样 -

[~,idx1,idx2] = intersect(A(:,1),A(:,2));
out = unique(A([idx1,idx2],:))

【讨论】:

  • 如果我有一个像 A = [1 2; 3 4; 2 5; 4 6; 5 6] 这样的案例,我想从中获得两个组:1 2 5 63 4 6
【解决方案2】:

以下似乎有效。它构建了一个矩阵 (B),它告诉哪些元素是连接的(通过 1 步)。然后扩展该矩阵 (C) 以包括 0 步、1 步、...、(n-1) 步连接,其中n 是节点数。

从该矩阵中,获得连接元素组 (R)。最后,只保留“最大”组(即那些不包含在其他组中的组)。

A = [1 2; 3 4; 2 5; 4 6; 5 6]; %// data
n = max(A(:)); 
B = full(sparse(A(:,1), A(:,2), 1, n, n )); %// matrix of 1-step connections
C = eye(n) | B; %// initiallize with 0-step and 1-step connections
for k = 1:n-1
    C = C | C*B; %// add k-step connections, up to k=n-1
end
[ii, jj] = find(C);
R = accumarray(ii, jj, [], @(x) {sort(x).'}); %'// all groups (maximal or not)
[xx, yy] = ndgrid(1:n);
C = cellfun(@(x,y) all(ismember(x, y)), R(xx), R(yy) ); %// group included in another?
result = R(all(~C | eye(n), 2)); %// keep only groups that are not included in others

这给了

>> result{:}
ans =
     1     2     5     6
ans =
     3     4     6

【讨论】:

  • 太棒了!谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多