我有一个包含两列的矩阵 - 位置A(:,1)
和索引A(:,2)
:
A=
10 1
15 1
5 2
10 2
18 2
20 2
24 3
30 3
35 3
我需要能够计算每个元素与每个索引块中所有其他元素之间的距离(位置值之间) - 省略非唯一的冗余对。上述示例的所需输出为:
索引1
5 (15-10)
说明:10到15之间的距离。不考虑15到10之间的距离,因为这不是唯一的并且已经计算过。
索引2
5 (10-5)
13 (18-5)
15 (20-5)
8 (18-10)
10 (20-10)
2 (20-18)
索引3
6 (30-24)
11 (35-24)
5 (35-30)
这些结果可以放在一个矩阵中:
diff=
5
5
13
15
8
10
2
6
11
5
如果没有for循环和if语句的复杂混合,是否有一种简洁的方法可以做到这一点?
答案 0 :(得分:3)
这可以使用带有匿名函数的accumarray
在一行中完成:
result = accumarray(A(:,2), A(:,1), [], @(x) {unique(pdist(x))});
在你的例子中,这给出了
result{1} =
5
result{2} =
2 5 8 10 13 15
result{3} =
5 6 11
这使用统计工具箱中的函数pdist
。如果你没有,你可以做到
result = accumarray(A(:,2), A(:,1), [], @(x) {unique(nonzeros(abs(bsxfun(@minus,x,x.'))))});