在排除某些行的矩阵的列中查找最大元素
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)个值[重复]