2013-06-21 4 views
0

Я пытаюсь найти первый 1 в каждом столбце матрицы без использования для или в течение некоторого времени. Скажем, у меня естьScilab: Как найти первую 1 в каждом столбце без циклов

-->A 
A = 

    1. 0. 0. 0. 
    0. 0. 1. 1. 
    1. 0. 1. 1. 
    1. 1. 0. 0. 

тогда я хотел бы получить [1,4,2,2] (я могу предположить, что всегда есть 1 где-то в каждом столбце). Дело в том, что когда я использую find (A), он дает мне [1,3,4,8,10,11,14,15].

Мне сказали не использовать циклы, но операции с матрицами, потому что scilab обрабатывает последние лучше.

Спасибо заранее!

ответ

1

С такой малой производительностью матрица может быть достаточно быстрой с петлей и, вероятно, более читаемой. Но одно решение, избегающее использования для циклов, может быть следующим.

//Find all rows and cols of the ones in A 
[row,col] = find(A); 

//Get all row positions that are in a new column index 
disp(row(find([1,diff(col)]))); 

Я думаю, что более readible решение было бы что-то вроде следующего:

//For each column 
for col=1:4 

    //Find only the first occurence 
    disp(find(A(:,col),1)); 

end 

Как уже упоминалось, с такой маленькой матрицей readibility должен быть более высоким приоритетом. Вы можете измерить производительность обоих (или других) решений на profiling.

Если вы хотите больше узнать о некоторых техниках повышения производительности, посмотрите here.

+0

Спасибо, это именно то, что я хотел сделать. Фактически матрица A, в которой я хочу выполнить такой поиск, намного больше, поэтому я надеюсь, что scilab получит преимущество от своей более высокой эффективности в векторизованных операциях. – user2509559