在排除某些行的矩阵的列中查找最大元素

Posted

技术标签:

【中文标题】在排除某些行的矩阵的列中查找最大元素【英文标题】:Finding the max element in a column of a matrix excluding certain rows 【发布时间】:2020-03-08 16:03:38 【问题描述】:

假设我有一个 nxn 矩阵。我的目标是找到第一列的最大元素,交换包含最大元素的行和第一行。接下来,我想找到第二列的最大元素,不包括第一行,然后交换这个新的最大元素的行和第二行。再次,找到第 j 列的最大元素,不包括第 1:j-1 行,然后将最大元素行与第 j 行交换,直到第 n-1 列(如在第 n 列期间,我只能选择从第 n 行开始)。 我目前的设置如下

for j = 1:n-1
   [~,row]=max(A(j:n,j));
   temp = A(row,:);
   A(row,:)=A(j,:);
   A(j,:)=temp;
   ...

虽然切换功能运行良好,[~, row]=max(A(j:n,j)) 能够并且始终如一地针对我专门处理的矩阵在 j 的第二次迭代期间输出第 1 行。我在这背后的思考过程是 j:n 代表我们要检查的行。注意到 j=2,对于它的第二次迭代,我希望这将搜索第 2 到第 n 行;但是,它似乎仍然检查每一行。

虽然之前有人问过这个问题,但我发现答案是同一行代码。

【问题讨论】:

您真的要交换整行吗?这表明只有最后一列定义了矩阵的最终排序 是的,这适用于 GEPP,所以行作为一个整体需要交换。例如,矩阵 [4,5,6; 1,2,3; 7,8,9]。我希望第一次迭代输出 [7,8,9; 1,2,3; 4,5,6],第一次迭代时 max2,1,7]=7,然后是 [7,8,9; 4,5,6; 1,2,3],在第二次迭代中 max2,5=5。 Tbh,在我正在寻找的状态下,这个算法似乎不会考虑最后一列。 max2,1,7]=7 是怎么结束的,根据你的描述,我预计最多 7,1,4。 我的错误。是的,期望的结果是 max4,1,7。 【参考方案1】:

您正在使用[~,row]=max(A(j:n,j));。假设您在迭代 j=2 中。 max 只会考虑第二行的输入。 row=1 的返回值表示 A 的第二行中的最大值。您放入函数的第一行。 max 函数不知道您实际上输入了更大的内容。您必须对此进行更正。

n=5
A=magic(n); %just some input data

for j = 1:n-1
   [~,row]=max(A(j:n,j));
   row=row+j-1;
   temp = A(row,:);
   A(row,:)=A(j,:);
   A(j,:)=temp; 
end

顺便说一句,matlab 可以在没有辅助变量的情况下进行行交换:

for j = 1:n-1
   [~,row]=max(A(j:n,j));
   row=row+j-1;
   A([row,j],:)=A([j,row],:); 
end

【讨论】:

谢谢,这太完美了。所以,为了确保我完全理解,当使用像 j:n 这样的间隔时,它(有点)创建一个新的矩阵,它是第 j 列到第 n 列,正如你所说,将第 j 列作为第一列并将第 n 列作为第 (n-j) 列?另外,感谢您提供更简洁的行交换。 是的,你的理解是对的。 A(j:n,j) 创建一个新矩阵,并传递给 max 函数。

以上是关于在排除某些行的矩阵的列中查找最大元素的主要内容,如果未能解决你的问题,请参考以下文章

从csv文件(python)的列中查找最大2(或n)个值[重复]

查找并匹配列中的元素并更改另一列中相应行的值

矩阵列的最小元素

我正在尝试在另一个数据框的列中查找数据框中的列的元素,但 index() 对我不起作用

如何在第一列中只有最小元素的矩阵中查找行?

如何查询数据库以查找包含来自多选 (Laravel) 的 json 数据的列中的元素