Преобразование массива Matalab 60000x10 в 60000x1 или 1x60000

С 2D-массивом размером 60000 строк, 10 столбцов у меня есть массив следующим образом

 [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]
.......

Любая строка будет содержать только одну «1»

Я должен уменьшить это до вектора строки или столбца, который показывает индекс, в котором у нас была 1. Например, для показанных выше строк мы должны получить

[6,1,10...] до 60 000-го значения.

Как я могу сделать это в Matlab без циклов?


person Wajih    schedule 20.09.2016    source источник


Ответы (2)


Обновление: более эффективным способом является умножение матриц:

idx = a * (1:size(a,2)).'

Предыдущий ответ:

попробуй это:

 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.')

используя Divakar benchmark:

------------------- With FIND
Elapsed time is 1.55641 seconds.
------------------- With MAX
Elapsed time is 0.703054 seconds.
------------------- With MTIMES
Elapsed time is 0.266676 seconds.
person rahnema1    schedule 20.09.2016
comment
Умножение матриц! Хороший. - person Divakar; 20.09.2016
comment
@Divakar В посте я узнал от вас, что умножение очень эффективно - person rahnema1; 20.09.2016

Вы можете использовать max -

[~,idx] = max(a,[],2)

Тест во время выполнения на массиве 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

Тайминги -

------------------- With FIND
Elapsed time is 4.267364 seconds.
------------------- With MAX
Elapsed time is 1.353760 seconds.
person Divakar    schedule 20.09.2016
comment
Интересный и умный подход!. знак равно - person Stewie Griffin; 20.09.2016
comment
@StewieGriffin, ха-ха, у Макса есть свои преимущества! :) - person Divakar; 20.09.2016