Algorithm 如何优化此索引算法 我的问题 我是否可以加快计算速度 是否有更好的算法或实现,我可以用来计算相同的值 描述算法
我有一个复杂的索引问题,我正在努力以有效的方式解决 目标是使用大小相等的矩阵Algorithm 如何优化此索引算法 我的问题 我是否可以加快计算速度 是否有更好的算法或实现,我可以用来计算相同的值 描述算法,algorithm,matlab,indexing,Algorithm,Matlab,Indexing,我有一个复杂的索引问题,我正在努力以有效的方式解决 目标是使用大小相等的矩阵w、dY和dX中的值的组合来计算矩阵w\u prime w_素数(i,j)的值计算为平均值(w(indY和indX)),其中indY和indX分别是dY和dX的指数,分别等于i和j 下面是一个在matlab中计算w_prime的算法的简单实现: for i = 1:size(w_prime,1) indY = dY == i; for j = 1:size(w_prime,2) indX = dX ==
w
、dY
和dX
中的值的组合来计算矩阵w\u prime
w_素数(i,j)
的值计算为平均值(w(indY和indX))
,其中indY
和indX
分别是dY
和dX
的指数,分别等于i
和j
下面是一个在matlab中计算w_prime
的算法的简单实现:
for i = 1:size(w_prime,1)
indY = dY == i;
for j = 1:size(w_prime,2)
indX = dX == j;
w_prime(ind) = mean( w( indY & indX ) );
end
end
性能问题
在下面的示例中,这种实现就足够了;然而,在我的实际用例中,w
,dY
,dX
是~3000x3000
,w\u prime
是~60X900
。这意味着每次指数计算都是在大约900万个元素上进行的。不用说,这个实现太慢,无法使用。此外,我还需要运行这段代码几十次
实例计算
如果我想计算w(1,1)
- 找到等于1的
索引,另存为dY
indY
- 找到等于1的
索引,另存为dX
indX
- 查找
和indY
的交点,另存为indX
ind
- 将
保存到平均值(w(ind))
w_素数(1,1)
X
,和T
,两者都是1XN,其中N是~3000。此外,X和T的值是分别由区间(160)和(1900)限定的整数
矩阵dX
和dT
只是距离矩阵,这意味着它们包含点之间的成对距离。Iedx(i,j)
等于abs(x(i)-x(j))
它们使用以下公式计算:dx=pdist(x)代码>
矩阵w
可以被认为是描述一个点对另一个点有多大影响的权重矩阵
计算w_素数(a,b)
的目的是确定由X
维度中的a
和T
维度中的b
分隔的点子集之间的平均权重
这可以表示为:
这一点非常简单:
如果没有相应的索引对,输出将是一个大小为nx
-by-ny
的数组,带有NaNs。如果您确信将一直有完整的索引,您可以将上述计算简化为
w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)
那么,accumarray做什么?它查看
[dX(:)、dY(:)]
的行。每行给出该行所贡献的(i,j)
w_prime中的坐标对。对于所有对(1,1)
,它将函数(@mean
)应用于w(:)
中的相应条目,并将输出写入w_prime(1,1)
你好!我想知道您是否可以对需要使用此计算的问题提供更一般的描述(例如,寻路-需要计算新位置,等等)。也许总的来说可以建议一个更好的算法?哈哈哇!好吧,这绝对不是我所希望的简单问题。当我与我的白板lol重聚时,我会尝试回到这个话题,希望在此期间有其他人可以帮助你。纯粹出于好奇,你为什么要这么做?找到平均影响力有什么普遍意义?我在猜测某种数据关联??每个问题都应该以如此详细和精确的方式来描述。我想和MATLABPerfect的创造者一起生孩子!这正是我要找的!
w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)