Значение «[tmp c] = max (S (:, I), [], 2); c (I) = 1: K;» в MatLab - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь перевести эталонную реализацию AP Clustering на C ++. Эта последовательность утверждений сбивает меня с толку, потому что похоже, что вектор c заполняется некоторыми числами, а затем быстро перезаписывается другим набором чисел. Что не имеет смысла. Вот код Matlab:

[tmp c]=max(S(:,I),[],2); c(I)=1:K;

Реализация R имеет нечто очень похожее:

    c <- max.col(s[, I], ties.method="first")
    c[I] <- 1:K

Это правда, что s равно NxN, а I имеет длину K << N. Однако как я прочитал, c имеет тот же размер, что и я, так что конечное значение - это просто перестановка 1: K, которая зависит от I, но не от результата первого оператора. </p>

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

1 Ответ

1 голос
/ 01 мая 2020

Говоря о версии R: если

s равно NxN, а I имеет длину K << N. </p>

, то

  • s[,I] имеет размеры N (строки) x K (столбцы)
  • согласно ?max.col, max.col "[f] ind [s] максимальная позиция для каждой строки матрицы "(выделение добавлено)
  • , таким образом c имеет длину N (т. е. равно числу строк из s[,I)

Если I имеет длину K, то присвоение значений c[I] заполнит только K из N значений c, оставив остальные N-K равными их исходным значениям .

R выполняет векторизованное присваивание, поэтому c[I] <- 1:K эквивалентно (но быстрее)

for (j in seq(K)) {
    c[I[j]] <- j
}
...