C++相談室 part130 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/03/31(金) 08:47:49.65ID:UkLjKqcm0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part129
http://echo.2ch.net/test/read.cgi/tech/1483940967/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1478440682/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/06/19(月) 19:46:59.76ID:OcegvzUdr
>>526
undefined behaviorとno diagnostics requiredだらけの言語で「アドレス確認すればわかる」とだけ言うのはあまりに安易な助言ではないか、と言っているのであって
確認方法の良し悪しには興味が無い
2017/06/19(月) 19:56:58.85ID:QZxUhfYw0
お前が何に興味があるかなんてまったく興味がない
2017/06/19(月) 21:31:25.95ID:/bUZDhU4a
>>519
>>514に出てきたえぴすなんたらと同じで、仮に知識があったとしても建設的な議論ができずに場をかき混ぜるだけの迷惑な存在に思える。
2017/06/20(火) 23:15:54.41ID:Mr4YEhWoM
>>514
そもそも苦しい言い訳すらできない事案はwebページに掲載してないだろうしなぁ
2017/06/21(水) 12:51:52.91ID:+NLKQqoi0
>>529
こんなとこで他人を中傷してるお前は
迷惑記事の書き手と同レベルだな
2017/06/21(水) 16:13:27.27ID:w7AAKRwP0
>>529
質問に必要なのは回答であって議論じゃない。
議論が建設的であろうがなかろうが質問に対する反応としては不適当だ。
回答が不十分だっていうことならそれは質問者が対話を重ねていくべきことで、
やみくもに話題を広げていく行為はそれこそ場をかき乱すだけだよ。

質問を元にした話題で雑談したっていいと思うが、
質問に対しては質問の回答を返すのが合理的な姿勢で、
先回りしてまで手取り足取り教えてやるような板じゃなかろう。
ム板が殺伐してるのは普通のこと。
2017/06/21(水) 23:22:10.09ID:rrguzdDtr
>回答が不十分だっていうことならそれは質問者が対話を重ねていくべき

「建設的な議論」の認識に齟齬が見られたが
>>529>>532の意見は概ね一致したようだ
めでたしめでたし
2017/06/22(木) 18:59:54.46ID:RmXtROOS0
templateのstaticメンバの初期化(実体化)についてわかる人、
教えてもらえないでしょうか。

次のようなクラス構成があります
template<typename T> class A {
public:
A() : foo(NULL) {}
...

void * foo;
};

template<typename T> class B {
public:
...
static A<T> bar;
};

class C : public B<C> {
public:
...
};

ここで、B<C>::barを実体化しないといけないので
1) 以下のように書くとVC++では問題ない
template<> A<C> B<C>::bar;
2) 以下のように書くとclang(xcode)では問題ない
template<> A<C> B<C>::bar = {};
3) GCC 4.9では1)でコンパイルは通るが実体化されない。

ということで、GCCでどう書いたらビルドが通るか教えてください。
よろしくお願いします。m(_ _)m
2017/06/22(木) 19:26:04.75ID:Pj60YbTlr
>template<> A<C> B<C>::bar;

本当に実体化をしようとしているのか、明示的な実体化が必要なのか疑問だ
template<…> X →テンプレート定義
template<…> X<Y> →テンプレート定義(部分特殊化)
template<> X<…> →フルの特殊化
template X<…> →明示的実体化
X<…> →使うことで暗黙の実体化
2017/06/22(木) 19:46:14.05ID:RmXtROOS0
>>535
レスありがとうございます。

実際のコードでは、AとBはそれぞれのヘッダファイルにすべて記述され、
Cのみcppでコード生成しています。1)及び2)はCのソース内に記述しています。
このため、スペシャライズは不要な筈ですが、B内で定義しているstatic変数は
Bのクラス内で使用しているため、実体化が必要です。
bar自体はコンストラクタがあるので、普通のstatic変数のように書けば
良いのではないかと思うのですが…。
何か勘違いしてるんですかね?
2017/06/22(木) 20:07:59.54ID:RmXtROOS0
>>534です、連投すいません。
どうやら解決したようです、デバッグしてみないと本当に解決しているか
どうかはわかりませんが(^^;

stackoverflowにヒントがありました。

https://stackoverflow.com/questions/2342550/static-member-initialization-for-specialized-template-class
// needs a copy constructor!
template<> Type Class<Arguments>::member = Type();

コピーコンストラクタで無理やり実体を作るという…。
vc、llvm、gccでそれぞれ書き方が違うとは、やな世の中になったもんだw
2017/06/22(木) 20:44:12.75ID:Pj60YbTlr
特殊化の説明を読んでいるのがよくわからんが
G++で通るコードとやらを貼っとくか

http://ideone.com/u4h6so
2017/06/22(木) 20:51:33.36ID:6MphhRRE0
>>534
> 3) GCC 4.9では1)でコンパイルは通るが実体化されない。
実体化されないの意味がよくわからんが
B::barの定義がないからだろ
ttps://wandbox.org/permlink/dK2e1pFJRGqDvw6G
2017/06/22(木) 21:50:59.77ID:Pj60YbTlr
>>534
>1) 以下のように書くとVC++では問題ない
>template<> A<C> B<C>::bar;

これはVisual C++が規格の14.7.3段落13を正しく実装していないためで
2)の書き方が正しい
2017/06/22(木) 21:52:32.77ID:RmXtROOS0
>>538さん, >>539さん
ありがとうございます。

なるほど、template<typename T>のままで初期化すればよかったんですね。
あ、でも、vc++2012でエラーが出ますね。
non-aggregates cannot be initialized with initializer list

vc++2015はプロジェクトを作ってないのでわかりません。
xcodeは、明日確かめてみます。
あ〜、templateは嫌いだorz
542デフォルトの名無しさん (ワッチョイ 7f91-yPlv)
垢版 |
2017/06/24(土) 13:41:09.22ID:u+Yuz9bZ0
配列に格納された行列同士の乗算がしたいんだけどさ
EigenのMapってこれ、コンパイル時に行列の行数・列数が決まってない時はどうやって利用するもんなの?
http://eigen.tuxfamily.org/dox/group__TutorialMapClass.html
Vector型に変更したりしてたら遅くなっちゃうだろうし・・・・どうやるんだろ・・・・
2017/06/24(土) 16:50:39.64ID:1xYcuW8pd
>>542
ろくに見ずに答えるけど、テンプレートパラメータを明示的に与えられないの?
2017/06/24(土) 17:52:02.95ID:UzNhAedeM
サンプルみた感じ、Dynamicっていうキーワードがあるみたいだけど
545デフォルトの名無しさん (ワッチョイ 9f32-LvKX)
垢版 |
2017/06/25(日) 14:15:18.57ID:ogKde9930
union aaa{
uint8_t byte[ 5 ];
struct bit_t {
uint32_t b0 : 5;
uint32_t b1 : 5;
uint32_t b2 : 5;
uint32_t b3 : 5;
uint32_t b4 : 5;
uint32_t b5 : 5;
uint32_t b6 : 5;
uint32_t b7 : 5;
}bit;
};
union bbb{
struct bit_t {
uint32_t b0 : 5;
uint32_t b1 : 5;
uint32_t b2 : 5;
uint32_t b3 : 5;
uint32_t b4 : 5;
uint32_t b5 : 5;
uint32_t b6 : 5;
uint32_t b7 : 5;
}bit;
uint8_t byte[ 5 ];
};
const aaa a = { 66, 77, 88, 99, 11 };
const bbb b = { a.bit.b0, a.bit.b1, a.bit.b2, a.bit.b3, a.bit.b4, a.bit.b5, a.bit.b6, a.bit.b7 };
bが{66,77,88,35,11}となってaと一致しません。何故ですか
2017/06/25(日) 15:01:36.01ID:WDBvKZ4J0
byte境界でないと配置できない環境なんじゃないの?
2017/06/25(日) 15:16:55.26ID:vsjTFzMZ0
uint32_tに5ビットずつ詰めてるからだろ
2017/06/25(日) 15:37:16.30ID:ogZvFgu/0
普通は単に unsigned b0:5: と書くべき
ビットフィールドに32tとか余計なモノ乗っけると解釈がおかしくなる
2017/06/25(日) 15:41:35.21ID:ogZvFgu/0
あとは副作用でpackアラインが1になってないから無理矢理境界作ってコンパイラが揃えようとしているとか
2017/06/25(日) 15:51:48.24ID:k9VtfbZw0
共用体の統一初期化記法のことはよくわからないけどちゃんとコンストラクタを書けば解決するのでは
https://wandbox.org/permlink/Fzd26GrwxkCJ5NmL
2017/06/25(日) 16:07:57.97ID:Y80WzbX30
C++を、10年以上勉強してから、共用体を使え

そもそも、初心者が使い道を知らないだろ
2017/06/25(日) 17:09:07.72ID:/94nlHOp0
>>545
なぜ一致すると思うのかをまず説明すべきではないかね?
2017/06/25(日) 17:14:35.54ID:CENP8UyG0
99: 1100011
35: _100011
何度かやってみると、合う時もあるな
554デフォルトの名無しさん (ワッチョイ 9f32-LvKX)
垢版 |
2017/06/25(日) 19:00:42.60ID:ogKde9930
uint32_tをuint64_tに変えたら一致するようになりました
ヒントになります?
2017/06/25(日) 19:15:35.89ID:0WoCYScE0
VC++2015で調べたらaaa,bbbは8byteでbit_tのメンバーは

b0: 0ビット目
b1: 5ビット目
b2: 10ビット目
b3: 15ビット目
b4: 20ビット目
b5: 25ビット目
b6: 32ビット目
b7: 37ビット目

に配置されてた
b6から配置がずれてて30bit目と31bit目がbit_tでは使われてない
なのでbでbit_tを使って初期値をセットしてもこの2bitの値は不定になる
この2bitが両方とも0の時4byte目は35、
30bit目が0で31bit目が1の時99になる
2017/06/25(日) 23:08:48.14ID:y0reYziw0
英語を読むのがだるいので JIS の仕様を見てみた。
まずは C99 (に相当する JISX3010:2003) の 6.7.2.1 にはこうある。

> 処理系は、ビットフィールドを保持するに十分な大きさの任意のアドレス付け可能な記憶域単位を割り付けてよい。
> 十分な領域が残っている場合、構造体内のビットフィールドの直後に続く別のビットフィールドは、同じ単位の隣接したビットに詰め込まなければならない。
> 十分な領域が残っていない場合、入り切らなかったビットフィールドを次の単位に入れるか、又は隣接した単位の境界をまたがせるかは、処理系定義とする。
> 単位内のビットフィールド割付けの順序 (上位から下位か又は下位から上位か) は、処理系定義とする。

この理屈にてらして >>555 を解釈すると、 VC++2015 での記憶域単位は 4 バイトで、ビットフィールドが単位に収まらなかった場合には次の単位に入れる
という選択を取っていることになる。

で、 C++03 (JISX3014:2003) ではどうかというと 9.6 にこうある。

> クラスオブジェクト内のビットフィールドの割り当て方は処理系定義とする。 ビットフィールドの境界調整は、処理系定義とする。 ビットフィールドは、何らかのアドレス取得可能な単位内に詰め込まれる。
> 参考 処理系によっては、ビットフィールドの割当て単位をまたがることもあるし、またがないこともある。 右から左に割り当てる処理系もあるし、左から右に割り当てる処理系もある。

この文章の「単位内に詰め込まれる」というのは C での規則にあるように記憶域単位をまたがない限り (次の単位に移らずに) 詰め込むという規則にも読
めるが、ちょっとよくわからない。 常識的に考えれば C より緩い規則ということはないだろうと思うんだけど……。

>>554
指定する型が割当て方に影響するような文面は見付けられなかった。
2017/06/25(日) 23:47:54.19ID:Tfx4tn9Gr
>常識的に考えれば (中略) ないだろうと思う

訳:ボクは非常識です
2017/06/26(月) 00:18:40.72ID:mZAJ/HXWd
トンチンカンな回答がほとんどで笑える
2017/06/26(月) 00:21:57.68ID:yL9hwVgE0
正しい回答をお願いします
2017/06/26(月) 00:29:03.33ID:mZAJ/HXWd
byteの40bitとbの40bitが違う位置だから (ほとんどの環境で)
2017/06/26(月) 00:32:01.19ID:mZAJ/HXWd
8個のbがbyteをカバーしていない
2017/06/26(月) 00:37:21.07ID:mZAJ/HXWd
>>546>>551
回答するレベルじゃない
何も書かない方がマシ
2017/06/26(月) 01:00:43.63ID:yL9hwVgE0
そもそも専門的な質問は2chで聞くべきじゃないし
信頼できる専門書を買うべき
2017/06/26(月) 01:09:10.53ID:RgMKiEkv0
共用体などは、C++を、10年以上勉強してから使え。
そもそも、初心者が使い道を知らないだろ

そもそも、5バイトは、40ビットだけど、
ビットフィールドが何バイトの領域に確保されるかも知らないのに、使うな。
処理系依存の機能を使うな

MISRA-C でも使用禁止だし、素人が使う共用体なんて、
バグだらけで製品で使えない

どの本にも、共用体を使った例など、載っていないだろ
2017/06/26(月) 01:26:24.49ID:YVNj3DlL0
>>564
質問者はただの学習目的かもしれんのに、
素人だとか製品では〜とか批判するのは的外れだろう
2017/06/26(月) 01:34:20.47ID:jY+d4s2A0
>>559
すでに言われてるがまとめると>>545の状況では先頭から
byteは連続する40bit
bit_tは使わない2bitをはさんだ42bit
を使用するのでbyte-bit_t間では
余分なbitの取得・必要なbitの欠落が起きて完全な情報のやりとりにならない
2017/06/26(月) 01:50:32.70ID:/d8dR7Ut0
5bitづつだとどうしてもアドレス跨ぎが発生するからな
4bitづつなら収まるけど
2017/06/26(月) 08:14:37.12ID:g/kuRdPjr
>信頼できる専門書を買うべき

ここは信頼できる回答が示されていても日本語が読めない低能が不毛なレスを続ける所なのだが
その典型例が>>559ということに本人が気付くことは無いのであった
2017/06/26(月) 20:30:39.48ID:g/kuRdPjr
そう言えば規格的には>>545の使い方はNGなので
>>551が言っていることはあながち間違いでもない
2017/06/26(月) 20:36:59.50ID:cFoP2i7u0
規格的には処理系定義なので処理系のマニュアル等で確認して使うならNGではないな
2017/06/26(月) 20:43:43.05ID:GM19K0OY0
>>551は質問の回答じゃないから
572デフォルトの名無しさん (ワッチョイ ffaa-4OJu)
垢版 |
2017/06/26(月) 23:25:57.41ID:RgMKiEkv0
共用体で、バイト配列とビットフィールドは、互換性がない型だから使えない。
最低でも、10年以上勉強していない者は、共用体でバグだらけになるから使うな

ビットフィールドのメモリ割付位置は、処理系依存だから、
他のOS・OSのビット数(32/64ビット)・他のコンパイラなどで使えない

また、コンパイラのバージョンアップで、再コンパイルするだけでも、
メモリ割付位置は変わるから、バグ有りで使えない

コンパイルエラーにならず、実行時エラーになるようなものは使えない
2017/06/26(月) 23:35:53.83ID:GM19K0OY0
なんかムキになってる
相変わらずズレてるね
2017/06/26(月) 23:55:54.69ID:NfcBoQUW0
失敗を通じてしか成長できないのにね
2017/06/27(火) 01:00:05.96ID:NwZhdH240
10年以上勉強さん流石ですw
2017/06/27(火) 08:01:35.53ID:bJ//gE7J0
10年勉強して >>572
残念な人
2017/06/27(火) 10:18:29.05ID:XwCnx1+f0
for_eachを並列で高速化する場合
-D_GLIBCXX_PARALLEL
でopenmp使う場合と
#include <experimental/numeric>
の使う場合と
どっちが高速なの?
578デフォルトの名無しさん (ワッチョイ 17f3-PFpe)
垢版 |
2017/06/27(火) 10:35:07.84ID:TVfTial50
自分でも無意識のうちにやってたし、ネットのサンプルとかでもよくあるけど
厳密にはunsigned intのほうが相応しい場合でもintつかってるコードをよく見かけるが
いちいちintをunsigned intで宣言し直すのもあほらしいしマクロつかって
unsigned intを_u_intとかに置き換えて宣言するのもそこまでしなくてもいいんじゃないかとも思うし
そこらへんはテキトーでいいんっすかね・・・
2017/06/27(火) 10:51:53.32ID:LPANs+0ed
std::size_t じゃなくて?
2017/06/27(火) 11:30:31.53ID:DL/1tDv80
負の値を取らないからって「厳密にはunsigned intのほうが相応しい」とは俺は考えないな
intで済むならintにする
2017/06/27(火) 12:25:58.18ID:+aQQjqLh0
正の数しかとらない変数がまだ初期化されていないことを明示するために負の値(特に-1)を使うとか割とよくある。
2017/06/27(火) 14:22:30.38ID:Gpx2Satod
>>580
・仕様として正の整数
・intの範囲で表せる
が成り立つならintにする?

自分ならstd::size_tを選ぶなあ

>>581
そんな需要があるとはちょっと不思議だ。クラスメンバ?
2017/06/27(火) 14:33:30.02ID:ntBitUxx0
int? i;
が許されるのはC#だっけ?
2017/06/27(火) 14:41:42.08ID:siPR+sC7M
そもそもアドレス宣言と初期化は同時にしろって話だしね
2017/06/27(火) 14:41:58.86ID:siPR+sC7M
アドレス宣言ってなんだ
宣言ね
2017/06/27(火) 15:11:12.82ID:DL/1tDv80
>>582
std::size_tの本来の用途じゃない数値でも使つのか?それはちょっと
2017/06/27(火) 16:00:23.87ID:Gpx2Satod
>>586
ああごめん、もともとは>>578
「 厳密にはunsigned intのほうが相応しい場合でも」
に反応しての発言だった。
2017/06/27(火) 19:00:49.27ID:bJ//gE7J0
>>582
size_tだと64bit環境で64bitになるぞ
2017/06/27(火) 19:02:17.31ID:kIT2/xtQ0
int が 64ビットになるべきだよね
2017/06/27(火) 19:07:21.81ID:bJ//gE7J0
当然そういうコンパイラはある
Windows上だと過去の色々なしがらみなどからintが32bitなのが普通
2017/06/27(火) 19:08:30.52ID:OA/PxRyod
ビット数が気になるなら、<cstdint>のint??_tやuint??_tを使えばいいやんけ。
2017/06/27(火) 19:09:53.97ID:bJ//gE7J0
厳密にはunsignedの方が相応しいってどういう場合を想定してる?

データサイズとかならunsignedの方が相応しいとも限らないよ
2017/06/27(火) 19:11:35.74ID:bJ//gE7J0
>>591
そういう問題じゃない
言語のデフォルトサイズ、一番効率が良いとされているサイズが32bitなのか64bitなのか
の問題
2017/06/27(火) 19:15:41.98ID:OA/PxRyod
その場合はintfast_t, uintfast_tを使う
2017/06/27(火) 19:19:52.85ID:N0WooBY/0
データが持つ意味と型の振る舞いは極力一致させるべきで
型の振る舞いはできる限り制限するべき
負の値を取り得ないならunsignedにする
ローカル変数ならsignedでもいい
2017/06/27(火) 19:30:07.19ID:kIT2/xtQ0
>>590
え?そんなコンパイラが実在するの?
2017/06/27(火) 19:33:33.64ID:OA/PxRyod
>>596
64-bit Linuxとか使ったことねーのか?
2017/06/27(火) 19:37:05.21ID:OA/PxRyod
>>597
ごめんなさい。
2017/06/27(火) 19:51:35.91ID:bJ//gE7J0
特殊な例だとcharからlong longまで全部64bitとかあるぞ
もちろんPCではないけど
2017/06/27(火) 19:52:40.24ID:bJ//gE7J0
こいつが噂のMZか
一人芝居の
601デフォルトの名無しさん (アウアウウー Sa9b-h10b)
垢版 |
2017/06/27(火) 20:06:34.19ID:3pUMWgYLa
>>593
言語つーかCPUに依存しないか。
Core2は64ビット対応でも32ビットのが速い。
64ビットが速いのはCore iからとか。
2017/06/27(火) 20:10:45.68ID:bJ//gE7J0
x86の64bitモードは32bitの方が速い命令がある
キャッシュ容量とかメモリ帯域とかを考えても、絶対に32bitで足りるなら、32bitを選んだ方がいい
2017/06/27(火) 21:37:34.10ID:ExZegnFlr
>こいつが噂のMZか
>一人芝居の

Qの一人芝居はまだ余興として見られるがもう一人のクソコテの一人芝居は痛々しくて見ていられない
2017/06/28(水) 02:28:02.75ID:Irk2C7ZK0
>>595
型の振る舞いをできる限り制限するのは誤りを起こさない、起こしても明確なエラーにするのが目的だと思うんだけど、
符号なし整数型にそういった機能は無くて実際の助けにはならないから、こういう議論が起こる。
2017/06/28(水) 04:29:23.47ID:matoew650
むしろsignedにしておけば不正に負の値が入れられた場合チェックしやすい
2017/06/28(水) 07:46:44.59ID:Aii/VoAq0
符合つき整数との比較や算術演算した際に、warning出たり符合なしに変換されたりと面倒なことが多いから、定義域が非負という理由だけではわざわざ符合なしにはあまりしたくない。
607デフォルトの名無しさん (スプッッ Sd3f-oVeJ)
垢版 |
2017/06/28(水) 08:16:59.41ID:MovvcuP9d
googleのスタイルだと整数は符号ありを使えってなってる
2017/06/28(水) 13:11:58.44ID:4LULrFdtd
APIも64bitは符号ありが多い
609デフォルトの名無しさん (ワッチョイ 7f91-fiUu)
垢版 |
2017/06/28(水) 14:24:20.43ID:qTRul81R0
Vvector<vector<float>> tensor;
のようなテンソルを、1列にまとめて
void Vector_Func(vector<float> &v){}
ベクトルの関数の引数にしたいんだけどさ
これって、新たにVector<float>型のベクトルを定義してそこにベクトルの中身をコピーし、それを利用して関数を呼び出して、さらにもとのテンソルにコピーして戻すしかないのかな?
2度のコピーにかかる時間を短縮できる方法があったら誰か教えて!!!
2017/06/28(水) 14:26:13.68ID:+YCVI2Ik0
typedef vector<vector<float> > tensorf;
それとも右辺値参照的な話だろうか
2017/06/28(水) 14:29:19.59ID:eX7vr1Kz0
参照になっているなら直接vを弄るだけでコピーする必要もないと思われ
2017/06/28(水) 15:12:35.77ID:matoew650
>>609
1列にまとめる必要があるという前提ならどうしようもない気がする
vector<vector<float>>を止めてデータの並びが最初から1列にまとまってるようなテンソルクラスを作るか、
どっかの行列ライブラリを転用するんだな
2017/06/28(水) 16:00:31.95ID:eX7vr1Kz0
参照渡しでvが正常に得られるということは、vectorが値の参照を許容しているとも言える。
2017/06/28(水) 16:46:10.90ID:cWs7iztoM
>>609
iteratorパターンかrange viewのようなものを作る
2017/06/28(水) 18:00:52.06ID:lG20CtJar
612は健常者
2017/06/28(水) 22:05:12.76ID:y88Z2FQA0
>>597
その64bit Linux に乗っているコンパイラは何?
617デフォルトの名無しさん (ササクッテロラ Sp71-kiAr)
垢版 |
2017/06/29(木) 22:16:27.01ID:3dQByb1op
C++の数値計算のコード読んでくとreadmeにSiam journal って雑誌の引用見かける事がやたら多いんだけどc++やる人は必読の雑誌だったりします?
2017/06/30(金) 01:47:04.93ID:66+xb1tk0
C++ってより言語を問わず数値計算やる人だな
高速性が要求される数値計算はC++が使われることが多いってだけ
2017/06/30(金) 01:56:16.60ID:/WxXdso/0
まず数学力を鍛えたほうがいい
2017/06/30(金) 08:34:53.69ID:2shJEbz+r
これがアスペというやつだな
2017/07/01(土) 07:18:19.26ID:C6ffpB7m0
式テンプレートを勉強中です。
X(i) op Y(i)だけで結果が決まる場合はともかく
行列の逆行列のような一要素の計算に行列全部が影響するような計算を
こいつで実装する意味ってありまつか?
実装例とかあったら教えてください
2017/07/01(土) 07:25:20.19ID:qtP/3v2i0
意味というか行列の逆行列のij成分はij余因子を行列式で割った値だと言うことを知っていれば
NxN行列の逆行列の各成分はij余因子行列である(N-1)x(N-1)行列の行列式の計算になるから
数学的帰納法的にテンプレート化可能
2017/07/01(土) 07:49:52.59ID:nS8nnQe50
>>622
君は説明がうまいね
2017/07/01(土) 08:05:35.58ID:qtP/3v2i0
いやそれほどでも・・・///
2017/07/01(土) 08:28:19.10ID:nS8nnQe50
式テンプレートで正項と負項をバサッと消し合うようなことができないかと考えて挫折したなあ
2017/07/01(土) 08:44:48.56ID:C6ffpB7m0
>>622
いや、その余因子を求めることも、そこから行列式を求めるにも、全行列値が必要になるわけだし、
そもそも、余因子行列式の計算はNxN->3x3までの変換が再帰的な計算でスタックを使いたおすことになるので、
ヒープに一時オブジェクトを使わずにすむといという式テンプレートのメリットが全くないんじゃないんですか?

だいたい余因子行列式の除算なんて効率悪すぎて数値計算じゃ使いませんよ。
話をはっきりさせるために、ここは逆行列計算をGauss-Jordanの掃き出し法に限定しましょうや。

>数学的帰納法的にテンプレート化可能
どういう意味です?

数学的帰納法とは、
i=1のときf(1)が成立する
i=nのときf(n)が成立すると仮定すれば
i=n+1のときも成立することを証明して、一般的にf(n)が成立とする
2017/07/01(土) 09:09:28.46ID:C6ffpB7m0
>>626
ちょっと、誤解を招きかねないんで、
余因子行列式が再帰的云々と書きましたが、
余因子に限らず、行列式の計算そのものが再帰的という意味です。
だから、行列式計算そのものがやたら時間がかかる。
大学の試験の答案とかで、途中点をかせぐために(連立方程式を解いて計算間違いするより加点が期待できる)、
余因子行列式/行列式
を明記したりしますが、このやり方はせいぜい手計算でできる4x4程度の話で、
それ以上だと掃き出し法に比較して極端に非効率ということです。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況