假设你有这个矩阵
>> 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
仔细观察,2
矩阵内部有一个P
,但上面的矩阵内部没有P
。
问题:
为什么sub2ind
索引与常规P(i, j)
索引不同?
之所以会出现差异,是因为有一对重复的坐标(此处以粗体标记):
在该
sub2ind
版本中,重复的坐标对导致indices
具有重复的值。该行P(indices) = P(indices)+1;
仅向 的该条目添加1
一次P
。这与 无关ind2sub
,这只是索引赋值的工作方式:更改不是“累积”的,因此重复的条目作用于原始值,而不考虑同一条目以前出现的情况。例如:或者,也许更清楚的是,请注意该值
50
在这里是如何无用的:另一方面,在
for
您明确累积更改的版本中,因此如果某个条目出现两次,您将向该条目添加1
两次。