gpt4 book ai didi

matlab - 在 Matlab 中合并两个不同维度的矩阵?

转载 作者:太空宇宙 更新时间:2023-11-03 20:04:20 25 4
gpt4 key购买 nike

我在 Matlab 中有两个矩阵 AB。 A 具有维度 mx6,例如

A=[  1     1     1     1   |  1     0;
1 1 1 2 | 1 0;
1 1 1 3 | 1 0;
1 1 1 4 | 1 0;
1 2 3 2 | 1 0;
1 2 3 3 | 1 0;
1 2 3 4 | 1 0]

B 的维度为 nx6,例如

B=[  1     1     1     1   |  1     1;
1 2 3 1 | 1 1]

我想合并 AB 并在不使用循环的情况下按照以下步骤创建矩阵 C:

1) 考虑B(i,1:4);如果存在 j 使得 A(j,1:4) 等于 B(i,1:4) [这可能发生对于最多一个 j] 然后 C(i,:)=[B(i,1:4) A(j,5)+B(i,5) A(j, 6)+B(i,6)]。对所有 i=1,...,n 执行此操作。

2) 将C中剩余的行填充到AB中按照步骤1)匹配不到的行。

在例子中

C=[  1     1     1     1   |  2     1;  %Step 1) above
------------------------------------
1 1 1 2 | 1 0; %Step 2) above
1 1 1 3 | 1 0; %firstly rows from A
1 1 1 4 | 1 0;
1 2 3 2 | 1 0;
1 2 3 3 | 1 0;
1 2 3 4 | 1 0;
1 2 3 1 | 1 1] %lastly rows from B

我尝试使用循环:

%STEP 1
for i=1:size(B,1)
for j=1:size(A,1)
if all(B(i,1:4)==A(j,1:4),2)
C(i,:)=[B(i,1:4) A(j,5)+B(i,5) A(j,6)+B(i,6)]
end
end
end



%STEP 2


C=[ C; A(logical(1-ismember(A(:,1:4), B(:,1:4),'rows')),:)];
C=[ C; B(logical(1-ismember(B(:,1:4), A(:,1:4),'rows')),:)];

最佳答案

使用 unique 的组合非常容易和 accumarray . unique 的工作原理是为您提供一个输出矩阵,其中删除了所有重复的条目。当涉及到 AB 时,这会很好地工作。

只需将 AB 连接成一个统一的矩阵,然后对前 4 列使用 unique 并分配此矩阵的每一行截断矩阵一个唯一的 ID。 unique 的第三个输出将为您提供该 ID,如果您想知道哪个 ID 对应于哪一行,则来自 unique 的第一个输出,其中每一行的输出为您提供了它对应的 ID。

您将使用 'rows''stable' 标志来确保我们查看矩阵中的每一行而不是每个单独的元素,并使用 'stable' 标志,我们根据从开始(顶部)到结束(底部)遇到唯一行的时间分配 ID。如果您没有放置 'stable' 标志,它会在内部对行进行排序,然后从排序列表的顶部到底部分配 ID。

如果你想达到你想要的输出,你必须使用'stable'。找到这些 ID 后,分别对第五列和第六列使用 accumarray 两次,然后应用单独的总和并将结果组合在一起。 accumarray 通过提供一组 ID 或键来工作,对于每个 ID/键,都有一个与此键关联的输出值。您将共享相同键的所有值分组,并对每个组执行一些操作。在我们的例子中,我们将应用 accumarray 两次,其中第一组输出值来自第五列,第二组输出值来自第六列。 accumarray 的默认行为是对属于同一组的所有值求和,这正是您想要的。

在我们的例子中,accumarray 的输出将是一个单列向量,它与在第一步中使用 unique 生成的唯一 ID 的总数一样长.您分别对第五列和第六列执行此操作,然后要获得最终矩阵,只需将 unique 的第一个输出以及两个 accumarray 输出合并到一个矩阵中最终得到输出。

像这样:

%// Your data
A=[ 1 1 1 1 1 0;
1 1 1 2 1 0;
1 1 1 3 1 0;
1 1 1 4 1 0;
1 2 3 2 1 0;
1 2 3 3 1 0;
1 2 3 4 1 0];
B=[ 1 1 1 1 1 1;
1 2 3 1 1 1];

%// Solution
[cols,~,id] = unique([A(:,1:4); B(:,1:4)], 'rows', 'stable');
out = accumarray(id, [A(:,5); B(:,5)]);
out2 = accumarray(id, [A(:,6); B(:,6)]);
final = [cols out out2];

这是我们的输出:

final =

1 1 1 1 2 1
1 1 1 2 1 0
1 1 1 3 1 0
1 1 1 4 1 0
1 2 3 2 1 0
1 2 3 3 1 0
1 2 3 4 1 0
1 2 3 1 1 1

关于matlab - 在 Matlab 中合并两个不同维度的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31299418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com