【发布时间】:2017-01-06 23:01:45
【问题描述】:
让z = [1 3 5 6] 并通过获取每个元素之间的所有差异:
我们得到:
bsxfun(@minus, z', z)
ans =
0 -2 -4 -5
2 0 -2 -3
4 2 0 -1
5 3 1 0
我现在想按升序排列这些值并删除重复项。所以:
sort(reshape(bsxfun(@minus, z', z),1,16))
ans =
Columns 1 through 13
-5 -4 -3 -2 -2 -1 0 0 0 0 1 2 2
Columns 14 through 16
3 4 5
C = unique(sort(reshape(bsxfun(@minus, z', z),1,16)))
C =
-5 -4 -3 -2 -1 0 1 2 3 4 5
但是通过查看[-5 -4 -3 -2 -1 0 1 2 3 4 5] 中的-5,
我怎么知道-5 来自哪里。通过阅读我自己的矩阵,
0 -2 -4 -5
2 0 -2 -3
4 2 0 -1
5 3 1 0
我知道它来自z(1) - z(4),即第 1 行第 4 列。
另外2 来自z(3) - z(2) 和z(2) - z(1),它们来自两种情况。不读取原始矩阵本身,我们怎么知道[-5 -4 -3 -2 -1 0 1 2 3 4 5]中的2原来在原始矩阵的第3行第2列和第2行第1列?
所以通过查看[-5 -4 -3 -2 -1 0 1 2 3 4 5] 中的每个元素,我们如何有效地知道-5 在原始矩阵索引中的位置。我想知道,因为我需要对 -5 和两个产生此结果的索引进行操作:例如,对于每个差异,比如说 -5,我做 (-5)*1*6,作为 z(1)- z(6) = -5。但是对于 2,我需要将 2*(3*2+2*1) 设置为 z(3) - z(2) = 2, z(2) - z(1) = 2,这并不明显。
仔细想想,我认为我不应该将bsxfun(@minus, z', z) 重塑为数组。我还将创建两个索引数组,以便我可以有效地执行上述(-5)*1*6 之类的操作。然而,这说起来容易做起来难,而且我还必须处理不明确的来源。还是我应该先做想要的操作?
【问题讨论】:
标签: matlab