私は C++ でいくつかの MatLab コードを書き直そうとしていますが、これに遭遇しました:
currentsign = sign(vector(i));
私はインターネットを見て、このリンクを見つけました: http://www.mathworks.co.uk/help/techdoc/ref/sign.html
C ++に符号関数があるかどうか疑問に思っていますか? そうでない場合は、作成に関するチュートリアルを誰でも提案できます。
ありがとうございました :)
私は C++ でいくつかの MatLab コードを書き直そうとしていますが、これに遭遇しました:
currentsign = sign(vector(i));
私はインターネットを見て、このリンクを見つけました: http://www.mathworks.co.uk/help/techdoc/ref/sign.html
C ++に符号関数があるかどうか疑問に思っていますか? そうでない場合は、作成に関するチュートリアルを誰でも提案できます。
ありがとうございました :)
template <typename T>
int sign (const T &val) { return (val > 0) - (val < 0); }
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;
}
私は提案します
最初に、単一の要素を取り、要素の値に応じて を返す functor の関数を作成し1
ます。-1
0
次に、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>);
}
#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;
}
テンプレートの特殊化を使用して、コンパイル時にそれを行うことができます。
も使えますしsign<n>::Positive
、Matlabsign<n>::Negetive
と同じものもsign<n>::Zero
使えます。sign<n>::Sign
1|0|-1
sign
#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
。
C99 にはsignbit()
とがあり、 Linuxcopysign()
で実装されているようです。glibc
ただし、使用しているプラットフォームを指定していないため、それが役立つかどうかはわかりません...