teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/10/19 00:54

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -1,1 +1,53 @@
1
- `std::valarray<double>` を sliceする方が万倍楽ちゃいますか?
1
+ `std::valarray<double>` を sliceする方が万倍楽ちゃいますか?
2
+
3
+ [追記]
4
+ columnを返すのやってみた:
5
+
6
+ ```C++
7
+ #include <iostream>
8
+ #include <algorithm>
9
+
10
+ template<typename T>
11
+ class column {
12
+ public:
13
+ column(T* data, size_t cols) : data_(data), cols_(cols) {}
14
+ T& operator[](size_t row) { return data_[cols_*row]; }
15
+ private:
16
+ T* data_;
17
+ size_t cols_;
18
+ };
19
+
20
+ template<typename T>
21
+ class matrix {
22
+ public:
23
+ matrix(size_t rows, size_t cols) : cols_(cols), rows_(rows) {
24
+ data_ = new T[rows*cols];
25
+ }
26
+ ~matrix() { delete[] data_; }
27
+ void fill(const T& val) { std::fill_n(data_, rows_*cols_, val); }
28
+ column<T> operator()(size_t col) { return column<T>(data_+col, cols_); }
29
+ T* operator[](size_t row) { return data_+cols_*row; }
30
+ private:
31
+ T* data_;
32
+ size_t cols_;
33
+ size_t rows_;
34
+ };
35
+
36
+ // おためし
37
+ int main() {
38
+ using namespace std;
39
+
40
+ matrix<double> mtx(2,3);
41
+ mtx.fill(0.0);
42
+ column<double> clm = mtx(1);
43
+ clm[0] = 1.23;
44
+ clm[1] = 2.34;
45
+
46
+ for ( size_t r = 0; r < 2; ++r ) {
47
+ for ( size_t c = 0; c < 3; ++c ) {
48
+ cout << mtx[r][c] << ' ';
49
+ }
50
+ cout << endl;
51
+ }
52
+ }
53
+ ```