gpt4 book ai didi

matlab - 在 Matlab 中矢量化条件求和循环

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

我有两个 M×N 矩阵,标记为 A 和 B,我想为 A 的每个唯一值创建一个向量,其中包含 B 中所有项的总和。例如,我有以下矩阵:

A = [6 2 3 4
5 2 3 3
5 5 6 2];

B = [.2 .5 .4 .1
.7 .2 .5 .1
.6 .6 .1 .9];

我想创建一个向量 C,其中每个索引对应于 D = unique(A) 的索引。所以对于这种情况,D = [2,3,4,5,6]

for I = 1:length(D)
C(I) = sum(B(A(:)==D(I));
end

当 D 的长度为 2000 项并且 A 和 B 都是 ~4000x20 矩阵时,这会变得非常慢。对加快速度有帮助吗?我尝试执行以下操作:

Indxs = bsxfun(@eq,A,reshape(D,1,1,length(D)));
for I = 1:size(Indxs,3)
C(I) = sum(B(Indxs(:,:,I));
end

但实际上并没有更快。

最佳答案

您可以使用 unique 的常用组合来完成此操作和 accumarray :

[D, ~, uA] = unique(A(:));
C = accumarray(uA, B(:));

使用您的示例数据,结果是:

>> D
D =
2
3
4
5
6

>> C
C =
1.6000
1.0000
0.1000
1.9000
0.3000

accumarray 的最基本形式(两个输入参数)的作用是对具有相同第一个参数值的所有第二个参数值求和。


如果 A 仅包含正整数,则有一个单行解决方案 sparsefind :

[D, ~, C] = find(sparse(A(:), 1, B(:)));

这是有效的,因为 sparse 会累积对应于相同索引的值。

关于matlab - 在 Matlab 中矢量化条件求和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25017650/

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