假设你有这个矩阵
>> P = zeros(8, 12)
P =
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
在每个坐标上加上1
。如果是相同的坐标,则为+1
。
>> angles = [1 2 1 3 3 2 5 6 2 1 3 8]
angles =
1 2 1 3 3 2 5 6 2 1 3 8
>> r = [1 2 4 2 5 6 1 4 6 6 3 6]
r =
1 2 4 2 5 6 1 4 6 6 3 6
如果我使用sub2ind
>> indices = sub2ind(size(P), angles, r);
>> P(indices) = P(indices) + 1;
>> P
P =
1 0 0 1 0 1 0 0 0 0 0 0
0 1 0 0 0 1 0 0 0 0 0 0
0 1 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0
但如果我用普通索引
>> for k = 1:length(r)
P(angles(k), r(k)) = P(angles(k), r(k)) + 1;
end
>> P
P =
1 0 0 1 0 1 0 0 0 0 0 0
0 1 0 0 0 2 0 0 0 0 0 0
0 1 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0
如果你仔细观察,在矩阵P
中有一个2
,但在上面的矩阵P
中没有。
问题:
为什么sub2ind
索引与常规P(i, j)
索引不同?
2条答案
按热度按时间xggvc2p61#
差异的产生是因为有一对坐标重复(在此以黑体标记):
在
sub2ind
版本中,重复的坐标对导致indices
具有重复的值。行P(indices) = P(indices)+1;
只将1
一次添加到P
的条目。这与ind2sub
无关,这只是索引赋值的工作方式:这些变化不是“累积的”,因此重复的条目作用于原始值,而不考虑相同条目的先前出现。举例来说:或者,也许更清楚地,注意值
50
在这里是无用的:另一方面,在
for
版本中,您显式累积更改,因此如果条目出现两次,则将1
两次添加到该条目。7xllpg7q2#
如果您想要一个更简单的实现,这就是
accumarray
设计的目的。