valarray 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第33章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① valarray に含まれている要素の平均値を求めるプログラムを作成してください。


要素の値の合計値は sumメンバ関数で、要素数は sizeメンバ関数で得られるので、非常に簡単です。

#include <iostream>
#include <valarray>

int main()
{
    std::valarray<int> va(5);
    va[0] = 9;
    va[1] = 4;
    va[2] = 7;
    va[3] = 4;
    va[4] = 6;

    std::cout << va.sum() / va.size() << std::endl;
}

実行結果

6

実戦的には、要素数が 0 の場合のことを考慮することを忘れないでください。

問題②

問題② 2つの valarray の内積を求めるプログラムを作成してください。


一方の valarray の要素を a0,a1,a2、他方の valarray の要素を b0,b1,b2 とすると、「a0 * b0 + a1 * b1 + a2 * b2」を得たいということになります。したがって、互いに同じインデックスにある要素同士で乗算し、それらの合計を取れば良いです。

#include <iostream>
#include <valarray>

namespace {
    void PrintValarray(const std::valarray<double>& va)
    {
        std::cout.setf(std::ios_base::showpoint);

        const std::size_t size = va.size();
        for (std::size_t i = 0; i < size; ++i) {
            if (i >= 1) {
                std::cout << ", ";
            }
            std::cout << va[i];
        }
        std::cout << std::endl;
    }
}

int main()
{
    std::valarray<double> va1(3);
    va1[0] = 3.0;
    va1[1] = 4.0;
    va1[2] = 5.0;

    std::valarray<double> va2(3);
    va2[0] = 6.0;
    va2[1] = 4.0;
    va2[2] = 2.0;

    std::cout << (va1 * va2).sum() << std::endl;
}

実行結果

44

問題③

問題③ 次のコードで作られる valarray を 5x5 の2次元配列(あるいは行列)と見なしたとき、左上から右下へ向かう対角線上の要素を、サブセットとして選び出すプログラムを、スライス、汎用スライス、マスク、間接的な指定の各方法で作成してください。

std::valarray<int> va(25);
for (std::size_t i = 0; i < va.size(); ++i) {
    va[i] = i;
}


#include <iostream>
#include <valarray>

namespace {
    void PrintValarray(const std::valarray<int>& va)
    {
        const std::size_t size = va.size();
        for (std::size_t i = 0; i < size; ++i) {
            if (i >= 1) {
                std::cout << ", ";
            }
            std::cout << va[i];
        }
        std::cout << std::endl;
    }
}

int main()
{
    std::valarray<int> va(25);
    for (std::size_t i = 0; i < va.size(); ++i) {
        va[i] = i;
    }

    const int sizeOfOneSide = 5;  // 1辺の要素数

    // スライス
    PrintValarray(va[std::slice(0, sizeOfOneSide, sizeOfOneSide + 1)]);

    // 汎用スライス
    std::size_t numsTable[] = {sizeOfOneSide};
    std::size_t strideTable[] = {sizeOfOneSide + 1};
    std::valarray<std::size_t> num(numsTable, 1);
    std::valarray<std::size_t> stride(strideTable, 1);
    PrintValarray(va[std::gslice(0, num, stride)]);

    // マスク
    PrintValarray(va[va % (sizeOfOneSide + 1) == 0]);

    // 間接的な指定
    std::valarray<std::size_t> indexes(sizeOfOneSide);
    for (int i = 0; i < sizeOfOneSide; ++i) {
        indexes[i] = i * (sizeOfOneSide + 1);
    }
    PrintValarray(va[indexes]);
}

実行結果

0, 6, 12, 18, 24
0, 6, 12, 18, 24
0, 6, 12, 18, 24
0, 6, 12, 18, 24


参考リンク


更新履歴

’2017/2/28 新規作成。



第33章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る