【问题标题】:filtering out -inf and inf values to 0 in c++在c ++中将-inf和inf值过滤为0
【发布时间】:2012-09-02 08:40:18
【问题描述】:

假设你有一个std::complex<double> array[N];

如何在 for 循环中将所有 -infinf 值设置为 0?

std::isinf 对我不起作用,编译器早于 C++11

【问题讨论】:

标签: c++


【解决方案1】:

试试这个:std::numeric_limits<double>::infinity() 将提供一个值,告诉您一个数字是否为无穷大。

这里是vectordouble 值的示例代码;您可以将repl_inf 更改为使用complex<double>

#include <iostream>
#include <algorithm>
#include <vector>
#include <limits>

using namespace std;

int repl_inf (double v) { return (v== std::numeric_limits<double>::infinity() || -v== std::numeric_limits<double>::infinity()) ? 0.0 : v; }

int main() {
    vector<double> v;
    v.push_back(1);
    v.push_back(1.0/0.0);
    v.push_back(2);
    v.push_back(-1.0/0.0);
    transform (v.begin(), v.end(), v.begin(), repl_inf);
    for (int i = 0 ; i != v.size() ; i++) {
        cout << v[i] << endl;
    }
    return 0;
}

在ideone上:link

对于complex&lt;double&gt;

bool isInf(double v) {
    return v== std::numeric_limits<double>::infinity()
       || -v== std::numeric_limits<double>::infinity();
}
bool isInf(complex<double> c) {
    return isInf(c.real) || isInf(c.imag);
}

【讨论】:

  • 这需要负无穷大检验。
  • @EthanSteinberg 谢谢,已添加。
  • 它对我不起作用...我尝试了for ( int i = 0; i&lt; N; i++){ if (real(phi[i])== std::numeric_limits&lt;double&gt;::infinity() || -real(phi[i])== std::numeric_limits&lt;double&gt;::infinity()){ phi[i] = 0; },其中 phi 是 std::complex ,没有 real() 失败,仍然打印出 inf 和 -inf跨度>
  • @pyCthon 您需要定义一个函数来测试complex 的各个组件的无穷大。我编辑了答案以显示如何完成。
【解决方案2】:
std::replace( array, array + N, std::complex( std::numeric_limits<double>::infinity(), 0.0), std::complex(0.0) );
std::replace( array, array + N, std::complex( -std::numeric_limits<double>::infinity(), 0.0), std::complex(0.0) );

bool isinf( std::complex<double> d )
{
  return std::abs( d.real() ) == std::numeric_limits<double>::infinity()
}

std::replace_if( array, array + N, isinf, 0.0 );

【讨论】:

  • 第一个不起作用,第二个也不起作用,它的 std::complex&lt;double&gt; 不是 vector&lt;double&gt; 或只是 double
  • @pyCthon 您在问题中指的是什么无穷大?你在找std::complex( inf, 0 )吗?
  • @pyCthon 已编辑,基于我认为您的要求。
  • @pyCthon 你确定你正在处理像std::complex(inf, -inf) 这样的值吗? “想象的负无穷大”确实有意义,但遇到这种情况非常不寻常。
  • 在 FFT 中使用之前的特征函数,因为 -inf 或 inf 会给我错误,而我的 matlab 等效代码中没有 inf 或 -inf,实际部分与您相同
猜你喜欢
  • 2017-04-13
  • 2021-03-13
  • 2011-10-29
  • 2021-01-25
  • 2017-06-27
  • 1970-01-01
  • 2016-02-20
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多