生成一个矩阵,其中每列的最大值保持不变,其他条目归零

时间:2015-04-06 15:33:02

标签: matlab matrix

我有一个10乘1000的矩阵,并希望生成另一个矩阵,这样我就可以保留每列中的最大元素并且为null或"零"其余9个条目。

可以在MATLAB中执行此操作吗?

2 个答案:

答案 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));