2

私は C++ でいくつかの MatLab コードを書き直そうとしていますが、これに遭遇しました:

currentsign = sign(vector(i));

私はインターネットを見て、このリンクを見つけました: http://www.mathworks.co.uk/help/techdoc/ref/sign.html

C ++に符号関数があるかどうか疑問に思っていますか? そうでない場合は、作成に関するチュートリアルを誰でも提案できます。

ありがとうございました :)

4

5 に答える 5

6
template <typename T>
int sign (const T &val) { return (val > 0) - (val < 0); }

Ambroz Bizjak によるクレジット

template <typename T>
std::vector<int> sign (const std::vector<T> &v) {
    std::vector<int> r(v.size());
    std::transform(v.begin(), v.end(), r.begin(), (int(*)(const T&))sign);
    return r;
}

ideone の完全な例

于 2012-08-16T15:06:08.317 に答える
4

私は提案します

最初に、単一の要素を取り、要素の値に応じて を返す functor の関数を作成し1ます。-10

次に、std::transformをこの関数/ファンクターと一緒に使用して、入力コンテナーを取得し、2 番目のコンテナーに目的の値を入力します。

template <typename T>
int signum(const T& val) {
  // implement signum logic
}

#include <vector>
#include <algorithm>

int main() {

  std::vector<int> data = ....;
  std::vector<int> signs(data.size());
  std::transform(data.begin(), data.end(), signs.begin(), signum<int>);

}
于 2012-08-16T15:06:12.367 に答える
1
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <vector>

inline int get_signum(int val) {
    return val < 0 ? -1
        : val == 0 ? 0
        : 1;
}

int main() {
    std::vector<int> values;
    for (int i = -5; i < 6; ++i)
        values.push_back(i);
    std::vector<int> signum(values.size());
    std::transform(values.begin(), values.end(), signum.begin(), get_signum);
    for (int i = 0; i < values.size(); ++i) {
        std::cout << std::setw(2) << values[i] << ' ' << signum[i] << std::endl;
    }
    return 0;
}
于 2012-08-16T15:11:45.017 に答える
1

テンプレートの特殊化を使用して、コンパイル時にそれを行うことができます。
も使えますしsign<n>::Positive、Matlabsign<n>::Negetiveと同じものもsign<n>::Zero使えます。sign<n>::Sign1|0|-1sign

#include <iostream>

template<int n>
struct sign{
    enum{
      Positive = (n > 0),
      Negetive = (n < 0),
      Zero     = 0,
      Sign     = ((n > 0) ? 1 : -1)
    };
};

template<>
struct sign<0>{
    enum{
      Positive = 0,
      Negetive = 0,
      Zero     = 1,
      Sign     = 0
    };
};

int main(){
    std::cout << sign<0>::Positive  << sign<0>::Negetive  << sign<0>::Zero  << sign<0>::Sign  << std::endl;
    std::cout << sign<1>::Positive  << sign<1>::Negetive  << sign<1>::Zero  << sign<1>::Sign  << std::endl;
    std::cout << sign<-1>::Positive << sign<-1>::Negetive << sign<-1>::Zero << sign<-1>::Sign << std::endl;


    return 0;
}

あなたはsign(n)そこでやっていましたが、ここでやりますsign<n>::Sign

于 2012-08-16T15:13:27.743 に答える
0

C99 にはsignbit()とがあり、 Linuxcopysign()で実装されているようです。glibcただし、使用しているプラ​​ットフォームを指定していないため、それが役立つかどうかはわかりません...

于 2012-08-16T15:11:20.273 に答える