将Matalab 60000x10阵列转换为60000x1或1x60000

Waj*_*jih 1 arrays matlab vectorization reduction

对于大小为60000行,10列的2D数组,我有如下阵列

 [0 0 0 0 0 1 0 0 0 0]
 [1 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1]
.......
Run Code Online (Sandbox Code Playgroud)

任何行只包含一个'1'

我必须将它减少到一个行或列向量,它显示我们有一个1的索引.例如,对于上面显示的行,我们必须最终得到

[6,1,10...] 超过第60,000个值.

如何在没有循环的Matlab中做到这一点?

rah*_*ma1 8

更新: 更有效的方法是使用矩阵乘法:

idx = a * (1:size(a,2)).'
Run Code Online (Sandbox Code Playgroud)

上一个答案:

试试这个:

 a=[...
 0 0 0 0 0 1 0 0 0 0
 1 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 1]
 [r ,~]=find(a.')
Run Code Online (Sandbox Code Playgroud)

使用Divakar基准:

------------------- With FIND
Elapsed time is 1.55641 seconds.
------------------- With MAX
Elapsed time is 0.703054 seconds.
------------------- With MTIMES
Elapsed time is 0.266676 seconds.
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 6

你可以用max-

[~,idx] = max(a,[],2)
Run Code Online (Sandbox Code Playgroud)

60000 x 10阵列上的运行时测试

基准代码 -

% Setup input array
a = zeros(60000,10);
idx = randi(size(a,2),1,size(a,1));
a(sub2ind(size(a),1:size(a,1),idx)) = 1;

% Timing code
disp('------------------- With FIND')
tic,for i = 1:500,[r,~]=find(a.');end, toc

disp('------------------- With MAX')
tic,for i = 1:500,[~,idx] = max(a,[],2);end, toc
Run Code Online (Sandbox Code Playgroud)

计时 -

------------------- With FIND
Elapsed time is 4.267364 seconds.
------------------- With MAX
Elapsed time is 1.353760 seconds.
Run Code Online (Sandbox Code Playgroud)