【问题标题】:Find saddle points in Matlab在 Matlab 中查找鞍点
【发布时间】:2015-08-24 16:20:01
【问题描述】:

我必须编写一个名为 saddle 的函数,它在输入矩阵 M 中找到鞍点。对于这个问题,鞍点定义为一个元素,其值大于或等于其行中的每个元素,并且小于或等于其列中的每个元素。该函数应返回一个名为indices 的矩阵,该矩阵正好有两列。 indices 的每一行对应一个鞍点,行的第一个元素包含鞍点的行索引,第二列包含列索引。鞍点在索引中提供的顺序与它们在 M 中的顺序相同,根据列主要排序。如果 M 中没有鞍点,则 indices 为空数组。这是我到目前为止所拥有的:

% function indices = saddle(M)
% Definition of a test matrix M:
M = [0.8147  0.1270  0.6324  0.2785; ...
     0.9058  0.9134  0.0975  0.5469];

[ rows,cols ] = size(M);

[valR,posR] = max(M,[],2);
[valC,posC] = min(M,[],1);
indices= [];

for i = 1:length(posR)
    for j = 1:length(posC)
        if posR(i) == posC(posR(i))
            indices= [indices; posR(i),posC(i)];
        end
    end
end

正如我对代码的评论,我定义了一个测试矩阵,该矩阵在位置 (1,1) 上有一个鞍点,但代码无法正常工作,因为它返回

indices =

 1     1
 1     1
 1     1
 1     1

我做错了什么?

【问题讨论】:

  • 一些提示:1)您没有使用变量“j”。也许你不需要那个循环。 2)您正在使用 if 语句将 posR(i) 与 posC(posR(i)) 进行比较。 posR 的最大值(对于您的 M 矩阵)为 4,但 posC 的最大值为 2。因此,如果您的行最大值恰好位于索引 4 处,则该比较无法成立。这表明您的 if 语句可能没有比较您想要的内容。

标签: matlab matrix


【解决方案1】:

你只需要一个循环,而不是一个双循环。鞍点的所有候选者都是索引为(i, posR(i)) 的条目。如果这样的条目在其列中也是最小的,那么它就是一个鞍,这意味着i == posC(posR(i))

您还输出了错误的数字:应该是(i, posR(i))

for i = 1:length(posR)
    if i == posC(posR(i))
        indices= [indices; i, posR(i)];
    end
end

请注意,您的算法忽略了一些条目可能相等的事实:maxmin 函数只为您提供第一个最大或最小条目。对于浮点数,这可能可以忽略,但对于整数,这可能非常重要。

这是一种没有 for 循环并考虑可能相等的方法:

saddles = (kron(valR,ones(1,cols))==M).*(kron(ones(rows,1),valC)==M);
[I, J] = find(saddles);

右边的两个因子中的每一个都是一个 0-1 矩阵,其中 1 表示鞍的候选者。逐项乘积产生一个 0-1 矩阵,其中 1 标记鞍点。然后find 命令返回鞍座的索引。

例如,用测试示例M = [1 2 1 2 ; 5 3 4 3]

saddles =

     0     1     0     1
     0     0     0     0

I =

     1
     1


J =

     2
     4

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2015-03-29
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多