【问题标题】:MATLAB - finding max/min in selected rows/columns of a matrixMATLAB - 在矩阵的选定行/列中查找最大值/最小值
【发布时间】:2015-10-29 04:31:40
【问题描述】:

如果我有一个矩阵,说:

A = [ 0 2 4 0 
      2 0 5 0
      4 5 0 3
      0 0 3 0 ]

我想在矩阵中找到我可以输入的最大值:

max(max(A))

max(A(:))

如果我只想找到第 1 行和第 2 行以及第 3 和第 4 列的最大值,我可以这样做:

a = [1 2]
b = [3 4]

max(max(A(a,b))

但是如果我想找到对应于该值的行和列的索引呢?

根据 matlab 文档,如果我使用整个矩阵,我可以使用 ind2sub 函数:

[val,idx] = max(A(:))
[row,col] = ind2sub(size(A),idx)

但是我如何才能让我的示例工作,我使用向量 ab 来确定它找到值的行和列?

到目前为止,这是我能够解决的唯一方法:

max_val = 0;
max_idx = [1 1];
for ii = a
    [val,idx] = max(A(ii,b))
    if val > max_val
        max_val = val
        max_idx = [ii idx]

但这对我来说似乎相当笨拙......有什么想法吗?

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    假设子矩阵 A(a,b) 是连续的(如您的示例中):

     A = [ 0 2 4 0 
      2 0 5 0
      4 5 0 3
      0 0 3 0 ]
    
    a = [1 2]; b = [3 4];
    B = A(a,b)
    [val,idx] = max(B(:));
    [row,col] = ind2sub(size(B),idx);
    maxrow = row + a(1) - 1;
    maxcol = col + b(1) - 1;
    

    您在子矩阵 B 中找到相对索引。这相当于从子矩阵左上角开始的附加行和列。

    现在假设 a 和 b 产生一组不是连续子矩阵的行和列,例如a = [1 3], b = [3 4],结果非常相似。 "row" 和 "col" 是 a 和 b 向量中的索引:

    A = [ 0 2 4 0 
      2 0 5 0
      4 5 0 3
      0 0 3 0 ]
    
    a = [1 3]; b = [3 4];
    B = A(a,b)
    [val,idx] = max(B(:));
    [row,col] = ind2sub(size(B),idx);
    maxrow = a(row);
    maxcol = b(col);
    

    现在您正在处理索引的索引。

    【讨论】:

    • 如果a=[1 3]b=[2 4] 会这样做吗?还是只有在没有重叠的情况下?
    • 不,那组行和列实际上并不是一个连续的子矩阵,所以简单地添加相对索引是行不通的。将这些数字发挥到极致,例如 a = [1 100] 和 b = [2 2000]。这仍然只是 2x2,但您正在从矩阵中截然不同的位置提取元素。你需要一个更通用的方法。不过也不会差太多。在我上面的代码中,“row”和“col”应该指向你应该使用的 a 或 b 中的索引。我将在上面编辑我的答案。
    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多