gpt4 book ai didi

matlab - 当赋值中的索引之间的映射不是单射时的向量化

转载 作者:行者123 更新时间:2023-12-01 18:40:23 24 4
gpt4 key购买 nike

假设c是标量值,TWM×N矩阵, k 是另一个 M-by-N 矩阵,包含从 1M 的值(并且至少有两个对 (i1, j1), (i2, j2) 使得 k(i1, j1)==k(i2, j2)) a 是一个 1-by-M 向量。我想对以下代码进行矢量化(希望这会加快速度):

T = zeros(M,N);
for j = 1:N
for i = 1:M
T(k(i,j),j) = T(k(i,j),j) + c*W(i,j)/a(i);
end
end

您有什么建议可以帮助我向量化此代码(或使其速度更快)吗?

提前致谢!

最佳答案

由于 k 只影响列内的值聚合方式,而不影响列之间的值聚合方式,因此您可以通过减少问题在于列上的单个循环并使用 accumarray像这样:

T = zeros(M, N);
for col = 1:N
T(:, col) = accumarray(k(:,col), c*W(:, col)./a, [M 1]);
end

我通过使用按照 Divakar 的答案初始化的输入值取 100 次迭代的平均值来测试每个解决方案(您问题中的循环 rahnema'sDivakar's 和我的)。这是我得到的结果(运行 Windows 7 x64、16 GB RAM、MATLAB R2016b):

solution | avg. time (s) | max(abs(err)) 
---------+---------------+---------------
loop | 0.12461 | 0
rahnema | 0.84518 | 0
divakar | 0.12381 | 1.819e-12
gnovice | 0.09477 | 0

要点:循环实际上并没有那么糟糕,但如果您可以将它们简化为一个循环,它可以节省您一点时间。

关于matlab - 当赋值中的索引之间的映射不是单射时的向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346014/

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