октавная матрица для выполнения цикла

Я новичок в Octave. У меня две матрицы. Мне нужно сравнить конкретный столбец одной матрицы с другим (моя матрица A содержит более 5 переменных, аналогично матрица B содержит то же самое.), И если элементы в первом столбце матрицы A равны элементам во втором матрица B, то мне нужно использовать третий столбец второй матрицы B для вычисления определенных значений. Я делаю это с октавой, используя цикл for, но это занимает много времени, чтобы выполнить вычисления за один день, я должен сделать это в течение года . Поскольку размер матриц очень велик, пожалуйста, предложите какой-нибудь альтернативный способ, чтобы я мог сократить свое время и вычисления. Заранее спасибо.

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

A=[1 2 3;4 5 6;7 8 9;6 9 1]
B=[1 2 4; 4 2 6; 7 5 8;3 8 4]

здесь столбец 1 первого элемента A равен столбцу 1 первого элемента B, даже второй столбец, поэтому я могу взять третий элемент B, но для второго элемента столбца 1 равен в A и B, но второй элемент столбца 2 отличается, здесь он должен искать этот элемент и печатать элемент в третьем столбце, и я делаю это с помощью цикла for, который очень медленный из-за большего размера. В моей реальной проблеме я дал цикл как написано ниже:

for k=1:37651
    for j=1:26018
       if (s(k,1:2)==l(j,1:2))
          z=sin((90-s(k,3))*pi/180) , break ,end

      end
  end 

Мне нужен альтернативный способ сделать это, который должен быть быстрее, чем этот.


person user835107    schedule 08.07.2011    source источник


Ответы (1)


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

A(:,1)

выбирает первый столбец матрицы. Вы можете сравнить матрицы / векторы, и результатом снова будет матрица / вектор 0/1:

> A(:,1) == B(:,1)
ans =

  1
  1
  0

Если вы назначите результат, вы можете снова использовать его для индексации в матрицах:

I = A(:,1) == B(:,1)
B(I, 3)

Это выбирает третий столбец B из тех строк, где первый столбец A и B равен.

Надеюсь, это поможет вам начать.

person hfs    schedule 08.07.2011
comment
Спасибо, но я должен проверить два условия: столбец 1 и столбец 2 для A и B должны быть равны, тогда только я могу взять третий столбец, и даже моя матрица перетасовывается. - person user835107; 11.07.2011
comment
@ user835107: Конечно, вы можете комбинировать несколько условий (опять же, проверьте промежуточные результаты в интерактивной консоли, чтобы увидеть, что происходит): A(:,1) == B(:,1) & A(:,2) == B(:,2) или all(A(:,1:2) == B(:,1:2), 2). Если вам нужно сделать более сложные вещи, вы также можете использовать find, чтобы получить затронутые индексы, а затем выполнить цикл for для них. - person hfs; 11.07.2011