【问题标题】:Trying to find index of minimum value in a matrix fails in Octave试图在矩阵中找到最小值的索引在 Octave 中失败
【发布时间】:2014-09-23 05:03:10
【问题描述】:

所以我有这个矩阵:

E1 = [54 5 2 4;4 5 19 29;31 4 2 9; 1 3 99 34]

假设我想找到最接近 18.9 的值的位置。令 A = 18.9

我愿意

[r,c] = find(E1==min(min(abs(E1-A))))

这不起作用。它返回r = "[](0x1)" and c = "[](0x1)"

然而,

如果我先这样做:

F = abs(E1-A) 然后做

[r,c] = find(F==min(min(F))) 

这给出了r = 2c = 3,这是正确的。 19 是最接近的值,19 位于第 2 行第 3 列。

那为什么这不起作用呢? F 就是 abs(E1-A) 那么为什么我不能在查找公式中用 abs(E1-A) 代替 F 呢?

【问题讨论】:

    标签: octave minimum


    【解决方案1】:
    min(min(abs(E1-A)))
    ans =  0.10000
    

    这为您提供了绝对差异的最小值。然后将其与具有绝对值的 E1 进行比较。这与您的第二个公式完全不同

    [r,c] = find(F==min(min(F)))
    

    您将最小差异与包含 E1 和 A 之间差异的绝对值的矩阵进行比较。如果您将第二个公式 F 替换为 abs(E1-A) 您将得到

    [r,c] = find(abs(E1-A)==min(min(abs(E1-A))))
    

    这也可以。不过我会建议另一种方法:

    E1 = [54 5 2 4;4 5 19 29;31 4 2 9; 1 3 99 34];
    A = 18.9;
    # get the index ( Column-major order) of the minimum
    idx = nthargout (2, @min, abs (E1-A)(:));
    # this returns 10
    # convert it ro row, column
    [r, c] = ind2sub (size (E1), idx)
    r =  2
    c =  3
    

    【讨论】:

    • 谢谢!我会试一试。我必须承认我在这里的例子比我正在使用的更简单。我正在使用使用 linspace 和 meshgrid 命令生成的两个 61x61 矩阵。因此,一个矩阵有 61 个重复行(即对于给定的列,所有行都具有相同的值),另一个矩阵有 61 个重复列。所以上面实际上返回了一大堆行和列位置,除非我在最后添加 ,1) 告诉它给我找到的第一个值。真的,我对来自 1 个矩阵的行号和来自另一个矩阵的列号感兴趣。我会试试你的代码!看起来不错!
    • 在 nthargout 中,2 是干什么用的?我不太明白“帮助 ntargout”在这件事上要说什么
    • @user3894764 nathargout (2, @min, ...) 将返回 out min 的第二个输出,就像使用 2 个输出参数调用一样。在这种情况下,它与[~, idx] = min (abs (E1-A)(:)) 相同。从这个案例中你可能会想到 ntargout,但它实际上是其他情况下非常有用的工具。
    • carandraug: 我先写了一个单行 [r, c] = ind2sub (size (E1), nthargout (2, @min, abs (E1-A)(:)));然后决定拆分它。你是绝对正确的,在这种情况下 [~,idx] = min (...) 会更好读。
    • 谢谢各位!这非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2021-11-10
    • 2020-11-29
    • 2023-03-03
    • 2021-01-13
    • 2012-06-29
    相关资源
    最近更新 更多