Matlab中的矢量化条件求和循环
我有两个M×N矩阵,标记为A和B,我想创建一个向量,包含B中所有项目的总和,用于A的每个唯一值。例如,我有以下矩阵:Matlab中的矢量化条件求和循环,matlab,matrix,sum,conditional,vectorization,Matlab,Matrix,Sum,Conditional,Vectorization,我有两个M×N矩阵,标记为A和B,我想创建一个向量,包含B中所有项目的总和,用于A的每个唯一值。例如,我有以下矩阵: 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(:)==
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
但它实际上并没有更快。您可以使用和的常用组合来完成此操作: 使用示例数据,结果是:
>> D
D =
2
3
4
5
6
>> C
C =
1.6000
1.0000
0.1000
1.9000
0.3000
accumarray
最基本的形式(两个输入参数)是将具有相同第一个参数值的所有第二个参数值相加
如果
A
仅包含正整数,则有一个带和的单行解:
这是因为
sparse
累加了与同一索引对应的值。此外,我还预先分配了C以加快速度。+1您能解释一下accumarray的功能吗?比MatLab帮助文件更清楚一点?这要快得多!我不知道accumarray,谢谢@EJG89我添加了一个解释。我还包括第二个使用sparse
>> D
D =
2
3
4
5
6
>> C
C =
1.6000
1.0000
0.1000
1.9000
0.3000
[D, ~, C] = find(sparse(A(:), 1, B(:)));