2016-08-09 4 views
1

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

В моем случае у меня есть вектор (или одномерный массив), и я хочу найти первый столбец, который равен вектору.

Я знаю, как это сделать «жесткий» способ: с findnext итерируя по первой строке, проверяя всю колонку. Но есть ли более разумный способ, который для меня не очевиден?

ответ

5

Предположим, что m - это ваша матрица, а v - это вектор. Тогда:

findfirst(c->view(m,:,c)==v,1:size(m,2)) 

Если вернуться 0 если вектор не найден и номер столбца, если она есть. Переход к основным элементам доступа может быть быстрее, но это также должно сделать трюк.

+0

Да, это умный способ, о котором я говорил. Мое решение - c-путь кодирования, я думаю :) – hr0m

+0

wait, откуда у вас есть функция просмотра? Я не могу найти его в std-lib – hr0m

+0

'view' находится в 0.5+, в 0.4 он называется' sub'. Но обновление до 0,5 должно быть хорошей идеей (особенно при использовании анонимных функций, таких как предикатный параметр 'findfirst') –

0

Так я и сейчас. Это не очень удобно. Я все еще уверен, что есть лучший способ, однако я не вижу его прямо сейчас.

Исходя из C/C++ и Python, мой взгляд выглядит несколько странным. Я не знаю о хорошем вкусе в джулии. Предложения приветствуются.

function findfirstcolumn(A, v) 
    index = findfirst(A[1,:],v[1]) 
    found = false 
    while index != 0 && found == false 
     found = true 
     for i = 2:size(v)[1] 
      if A[i,index] != v[i] 
       found = false 
       break 
      end 
     end 
    if found == true 
     return index 
    end 
     index = findnext(A[1,:], v[1], index+1) 
    end 
    return 0 
end 
Смежные вопросы