Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中的矢量化条件求和循环_Matlab_Matrix_Sum_Conditional_Vectorization - Fatal编程技术网

Matlab中的矢量化条件求和循环

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(:)==

我有两个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(:)==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(:)));