【问题标题】:How to find all index pairs of unequal elements in vector (Matlab)如何在向量中找到所有不相等元素的索引对(Matlab)
【发布时间】:2014-02-18 11:45:25
【问题描述】:

假设我在 Matlab 中有以下向量:

V = [4, 5, 5, 7];

如何列出(例如在 n×2 矩阵中)与向量中不相等元素对应的所有索引对。例如对于这个特定的向量,索引对将是:

index pairs (1, 2) and (1, 3) corresponding to element pair (4,5)

index pair (1, 4) corresponding to element pair (4,7)

index pairs (2, 4)  and (3, 4) corresponding to element pair (5,7)

我需要这个的原因是因为我有一个成本函数,它以V 之类的向量作为输入并产生一个成本值。

我想看看向量中两个不同元素的随机交换如何影响成本值(将其用于最陡下降的爬山)。

索引对的顺序也无关紧要。就我而言,(1,2)(2,1) 相同。

例如,如果我的成本函数是 evalCost(),那么我可以有 V = [4, 5, 5, 7]

evalCost(V) = 14

W = [4, 7, 5, 5] 的成本可能是:

evalCost(W) = 10

如何在 Matlab 中获取“交换”对索引的列表。希望我的问题很清楚 =)

【问题讨论】:

  • 这是一种完全不同的方法,但我相信pdist2 可能会让你开心。

标签: matlab vector


【解决方案1】:

成本函数部分看不懂,不过第一部分很简单:

[a,b]=unique(V)
C = combnk(b,2)

C 包含索引,V(C) 包含值:

C = combnk(b,2)

C =

     1     2
     1     4
     2     4

V(C)

ans =

     4     5
     4     7
     5     7

【讨论】:

  • +1 谢谢@Daniel。您不必关心成本函数部分,我只是想解释我的问题背后的动机。关键是我只需要索引 :) 然后我用成本函数评估新的交换向量 =) 这清楚了吗?我想你的答案就是我需要的一切。谢谢!
  • 嗨,丹尼尔,在更一般的情况下呢?我想我可能也需要那个=)我更新了我的问题。如果允许冗余对怎么办?查看我更新的问题 =)
【解决方案2】:

使用bsxfun,然后使用find 的两个输出版本来获取对。 triu 应用于bsxfun 的输出以仅考虑两个可能的顺序之一。

[ii jj] = find(triu(bsxfun(@ne, V, V.')));
pairs = [ii jj];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多