我有一个10乘1000的矩阵,并希望生成另一个矩阵,这样我就可以保留每列中的最大元素并且为null或"零"其余9个条目。
可以在MATLAB中执行此操作吗?
答案 0 :(得分:2)
我通常不会回答这种类型的问题(即给我teod coodz ),但我主要回答的是长寿。这是一个有趣的问题需要解决。
无论如何,您要求的内容非常简单。使用max
并在列中单独为矩阵操作,并使用max
的第二个输出。这些为您提供每列的行位置,为您提供最大值。 max
的第一个输出为每列提供相应的最大值。
只需创建一个零矩阵并使用max
的第二个输出来索引此空白矩阵,并将从第一个输出中检索到的相应最大值放入此矩阵中。您只给出了每列的行位置。因此,您需要额外调用sub2ind
来完成分配,我们需要找到与每列最大值的位置相对应的线性索引,并将每列的最大值分配给每个相应的位置。列。
因此,假设您的矩阵为X
,请执行以下操作:
[Y,ind] = max(X, [], 1);
out = zeros(size(X));
vals = sub2ind(size(X), ind, 1:size(X,2));
out(vals) = Y;
>> rng(123123);
>> X = randi(10,5,5)
X =
4 5 4 8 7
10 2 8 7 2
3 1 9 1 10
9 6 6 4 4
8 3 5 2 4
在开始运行代码后,我们得到:
out =
0 0 0 8 0
10 0 0 0 0
0 0 9 0 10
0 6 0 0 0
0 0 0 0 0
上述方法假定每列唯一条目。如果您的列具有多个具有相同最大值的实例,则只会保存这些值的一个,并且列的其余部分(包括其他共享的最大值)将变为零。具体来说,遇到的最大值的第一个实例将被保存,其他值将消失。
答案 1 :(得分:2)
这是另一种方式。即使有多个此类条目,这也会保留所有列条目等于列的最大值。
让X
表示矩阵,Y
表示结果。然后:
Y = X.*bsxfun(@eq, X, max(X));