Eigen: правильный способ вызова lpNorm () - PullRequest
0 голосов
/ 28 октября 2018

Как вызвать lpNorm с матричной матрицей в качестве ввода?

Вот проблема из моего кода:

template<class number>
void normalize_in_place(Matrix<number,Dynamic,Dynamic> & A, level l, axis a){

  const int p = lp_norms::level2pvalue(l);
  switch ( a ) {
    case row: 
      // TODO: get lpnorm working. 
      A = A.transpose().cwiseQuotient(A.rowwise().lpNorm<p>()).transpose();
      //A = A.transpose().cwiseQuotient(A.rowwise().norm()).transpose();
      break;
    case col:
      // TODO: get lpnorm working. 
      //A = A.cwiseQuotient(A.colwise().lpNorm<p>());
      A = A.cwiseQuotient(A.colwise().norm());
      break;
  }
}

Ошибка при компиляции с:

ошибка: ожидаемое первичное выражение перед [закрыть скобки функции lpNorm]

, где я подставил скобки для стрелки, которую вы увидите на выходе компилятора.

** После обновления собственного значения в выпуске от 23 июля я получаю следующую ошибку:

ошибка: недопустимые операнды типов '' и оператор 'const int' в двоичный '<'A = A.transpose (). CwiseQuotient (A.rowwise (). LpNorm <p>()). Transpose ();

По-видимому, lpNorm не разрешается;Однако я включил Eigen/Dense, и стандарт .norm() работает.

Независимо от того, какую конфигурацию я использую, она не работает.

Как правильно назвать lpNorm?

1 Ответ

0 голосов
/ 28 октября 2018

Если у вас есть этот код внутри шаблона, где тип A зависит от параметров шаблона:

A.rowwise().lpNorm<p>();

Ключевое слово template необходимо перед функцией шаблона:

A.rowwise().template lpNorm<p>();

См. Где и почему я должен поставить ключевые слова "template" и "typename"? .

Без ключевого слова template GCC пытается обработать <в <p> как оператор меньше чем и выдает сообщение об ошибке, которое вы видите.Clang выдает более полезное сообщение об ошибке error: missing 'template' keyword prior to dependent template name 'lpNorm'.

Также обратите внимание, что аргумент шаблона p в lpNorm<p> должен быть константным выражением (вычисляется во время компиляции).Похоже, что в вашем примере lp_norms::level2pvalue(l) не будет константным выражением.

...