不使用for循环创建类矩阵

时间:2013-12-09 20:08:34

标签: matlab matrix

我正在尝试在MATLAB中创建一个类矩阵,最好不要使用for循环。所以我有A

A = [ 1 2 3 4;
      2 5 4 1;
      7 2 3 4];

现在我想创建一个类矩阵,所以我想查找每列的最大值,无论该位置是什么,都将成为“1”。因此,使用A,我希望B看起来像这样:

B = [ 0 0 0 1;
      0 1 0 0;
      1 0 0 0];

我一直在尝试使用以下代码创建B矩阵,然后使用以下代码搜索每列中的最大值:

 [rows_A columns_A] = size(A);
 B = zeros(rows_A, columns_A);
 max(A, [], 2); 

然后我尝试使用ind2sub来获取A中的位置,这样我就可以在B矩阵中加上“1”。这种方法没有成功。矩阵A可以是任何维度。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用maxsub2ind标记每行具有最大值的列,如下所示:

[~,indMaxCol] = max(A,[],2);
B = zeros(size(A));
B(sub2ind(size(B),1:size(B,1),indMaxCol.')) = 1  %' flag largest column, each row
B =
     0     0     0     1
     0     1     0     0
     1     0     0     0

另一个不需要sub2ind的解决方案是创建sparse矩阵:

Bs = sparse(1:size(B,1),indMaxCol,1)
Bs =
   (3,1)        1
   (2,2)        1
   (1,4)        1

可以使用full(Bs)将其转换为full matrix

答案 1 :(得分:1)

bsxfun的单行解决方案(计算每行的最大值,然后比较相等性):

bsxfun(@eq, A, max(A,[],2))

这与@ chappjc在一个方面的解决方案不同:如果在某行中多次达到最大值,则会给出所有列,其中达到最大值。例如:

>> A = [ 4     2     3     4
         2     5     4     1
         7     2     3     4 ];

>> bsxfun(@eq, A, max(A,[],2))

ans =

     1     0     0     1
     0     1     0     0
     1     0     0     0