Nano Hash - криптовалюты, майнинг, программирование

Найдите наименьшее действительное значение в комплексном векторе

Как найти наименьшее положительное действительное число в комплексном векторе размером N на 1 в Eigen3? Например, в этом случае я хотел бы найти значение 3.64038.

#include <Eigen/Dense>
#include <iostream>
using namespace std;
using namespace Eigen;

int main()
{
    MatrixXd m(4, 4);
    m << 1, 0, 1, 1,
        0, 2, 0, 1,
        0, 2, 1, 0,
        2, 1, 2, 1;
    cout << m << endl;
    cout << m.eigenvalues() << endl;
    return 0;
}

Выход

1 0 1 1
0 2 0 1
0 2 1 0
2 1 2 1
        (3.64038,0)
      (-0.444745,0)
 (0.902183,1.01932)
(0.902183,-1.01932)

Элементы вектора, у которых мнимая часть не равна 0, должны быть исключены.

Я написал следующую функцию, но мне было интересно, есть ли подход с использованием методов Эйгена.

double findPositiveRealMin(VectorXcd v)
{
    VectorXd v_imag = v.imag();
    VectorXd v_real = v.real();
    for (int i = 0; i < v.rows(); i++)
    {
        if (v_imag[i] != 0 | v_real[i] <= 0)
            v_real[i] = 1.0e16;
    }
    return v_real.minCoeff();
}
14.06.2021

  • Для сложного вектора v вы можете получить части числа через .real() / .imag(), поэтому: v.real().maxCoeff() даст вам макс. реальный коэффициент. См. документацию: eigen.tuxfamily.org/dox/group__QuickRefPage.html eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html eigen.tuxfamily.org/dox/group__CoeffwiseMathFunctions.html 14.06.2021
  • наименьшее положительное действительное значение обоих 0.902183 не требуется, потому что они имеют ненулевые мнимые части? 14.06.2021
  • @Калет, да, действительно. 14.06.2021
  • @Седрик, спасибо, но мне нужно наименьшее число больше нуля с мнимой частью нуля. 14.06.2021
  • @rinkert: верно, моя ошибка. Я неверно истолковал ваш пример. Я полагаю, вы могли бы написать пользовательского посетителя как stackoverflow.com/questions/50027494/, но я не знаю встроенного метода. Может быть, у кого-то есть лучшее предложение. 14.06.2021
  • На самом деле, немного надуманно, но вроде работает: (v.imag().array() == 0 && v.real().array() > 0).select(v.real(), 1e16).minCoeff() 14.06.2021
  • @Cedric, это работает, спасибо! вы можете превратить это в ответ, если хотите 14.06.2021

Ответы:


1

Один из вариантов — создать логический массив, а затем вызвать для него Eigen::select. На основе https://forum.kde.org/viewtopic.php?f=74&t=91378

В таком случае:

Eigen::VectorXcd v = m.eigenvalues();

// minimum positive real value with zero imaginary part
Eigen::Array<bool,Eigen::Dynamic,1> cond1 = (v.imag().array() == 0);
Eigen::Array<bool,Eigen::Dynamic,1> cond2 = (v.real().array() > 0);
double some_big_value = 1e16;

std::cout << (cond1 && cond2).select(v.real(), some_big_value).minCoeff() << std::endl;

... или, как однострочный:

std::cout << (v.imag().array() == 0 && v.real().array() > 0).select(v.real(), 1e16).minCoeff() << std::endl;
14.06.2021

2

В этом однострочнике используется тернарный оператор в сочетании с методом Эйгена unaryExpr().

std::cout << m.eigenvalues().unaryExpr([](auto a){return a.imag() != 0 || a.real() < 0 ? 1.e16 : a;}).real().minCoeff() << std::endl;
14.06.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..