我正在尝试在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
可以是任何维度。非常感谢任何帮助。
答案 0 :(得分:1)
您可以使用max
和sub2ind
标记每行具有最大值的列,如下所示:
[~,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