2010-02-02 4 views
7

Tôi làm cách nào để sử dụng std::valarray để lưu trữ/thao tác mảng 2D?Tôi có thể sử dụng std :: valarray để lưu trữ/thao tác một mảng 2D liền kề như thế nào?

Tôi muốn xem ví dụ về mảng 2D với các phần tử được truy cập theo chỉ mục hàng/cột. Nội dung như mã giả này:

matrix(i,j) = 42; 

Ví dụ về cách khởi tạo mảng như vậy cũng sẽ đẹp.

Tôi đã biết Boost.MultiArray, Boost.uBlas và Blitz ++.

Hãy trả lời lý do tại sao tôi không nên sử dụng valarray cho trường hợp sử dụng của mình. Tuy nhiên, tôi muốn bộ nhớ cho mảng đa chiều là một khối liền kề (cột x hàng). Không có mảng lồng nhau kiểu Java.

+0

Tại sao bạn muốn sử dụng valarray? Tôi đã không nhìn thấy nó trong sử dụng bất cứ nơi nào và chỉ biết các đối số chống lại việc sử dụng nó. –

+1

@gf: Tôi khá hài lòng với việc tăng cường mảng đa chiều "động". Nhưng tôi tình cờ gặp một số nơi khác trong SO, và tò mò về cách nó có thể được sử dụng cho các mảng đa chiều. Ví dụ trực tuyến về việc sử dụng valarray (đặc biệt cho trường hợp sử dụng của tôi) có vẻ khan hiếm. –

+2

@GeorgFritzsche các đối số chống lại việc sử dụng nó là gì? – johnbakers

Trả lời

11

Off đỉnh đầu của tôi:

template <class element_type> 
class matrix 
{ 
public: 
    matrix(size_t width, size_t height): m_stride(width), m_height(height), m_storage(width*height) { } 

    element_type &operator()(size_t row, size_t column) 
    { 
     // column major 
     return m_storage[std::slice(column, m_height, m_stride)][row]; 

     // row major 
     return m_storage[std::slice(row, m_stride, m_height)][column]; 
    } 

private: 
    std::valarray<element_type> m_storage; 
    size_t m_stride; 
    size_t m_height; 
}; 

std::valarray cung cấp nhiều cách thú vị để truy cập vào các yếu tố, thông qua lát, mặt nạ, lát multidimentional, hoặc một bảng gián tiếp. Xem std::slice_array, std::gslice_array, std::mask_arraystd::indirect_array để biết thêm chi tiết.

+0

Ah vâng, cảm ơn bạn. Đó là những gì tôi đang tìm kiếm. Tôi đặc biệt thích rằng bạn đã cho thấy cả truy cập chính hàng/cột. –

+0

Dữ liệu valarray có được đảm bảo tiếp giáp không, như vector? –

+0

Từ MSDN: Lớp mẫu mô tả đối tượng điều khiển một chuỗi các phần tử kiểu Type được lưu trữ dưới dạng mảng, được thiết kế để thực hiện các phép toán tốc độ cao và được tối ưu hóa cho hiệu suất tính toán. Vì vậy, tôi sẽ giả định như vậy. – MSN

0

Here's một ví dụ trong đó bao gồm một chút ma trận thao tác

+1

Ít nhất bạn có thể đưa ra một ví dụ ngắn để giải quyết câu hỏi không? Các trang web bên ngoài có thể bị hỏng tại một số điểm. –

+1

Tôi dường như không thể tìm thấy một phần 'valarray' 2D trong ví dụ đó nhưng một ma trận 2D bị san bằng. Tôi nghĩ rằng OP muốn một 'valarray >' thingy. – dirkgently

+0

@dirkgently: Tôi muốn bộ nhớ mảng được tiếp giáp, vì vậy không có valarray >. Câu hỏi đã chỉnh sửa. –

5
#include <iostream> 
#include <valarray> 

using namespace std; 

typedef valarray<valarray<int> > va2d; 

int main() 
{ 
    int data[][3] = { {1, 2, 3}, {4, 5, 6} }; 
    va2d mat(valarray<int>(3), 2); 
    for (int i = 0; i < 2; ++i) 
    { 
     for (int j = 0; j < 3; ++j) 
      mat[ i ][ j ] = data[ i ][ j ]; 
    } 
    for (int i = 0; i < 2; ++i) 
     for (int j = 0; j < 3; ++j) 
      cout << mat[ i ][ j ] << endl; 
} 

Thông tin thêm về valarray:

  • Nó được tối ưu hóa cho tính toán số.
  • Đây là vector như vùng chứa có chức năng thành viên đặc biệt để cắt và cắt.
  • Không lặp
  • Được thiết kế cho các máy vector và hoạt động kém trên những hiện: vector truy cập có thể nhanh hơn
  • Được không được hỗ trợ bởi tất cả các trình biên dịch (kiểm tra tài liệu)/kém thực hiện
  • Xem 26.1 cho các loại đó có thể được sử dụng như một tham số để valarray<T>: Ví dụ:

3 Ngoài ra, nhiều thành viên và liên quan đến chức năng của valarray có thể được khởi tạo thành công và sẽ thể hiện hành vi được xác định rõ ràng nếu và chỉ nếu T thỏa mãn các yêu cầu bổ sung được chỉ định cho mỗi thành viên hoặc chức năng liên quan như vậy .

4 [ Ví dụ: Nó có giá trị để nhanh chóng valarray, nhưng điều hành>() sẽ không được khởi tạo thành công cho toán hạng valarray, vì phức tạp không có bất kỳ lệnh nhà khai thác. —end example]

Chỉnh sửa # 2: Các chuẩn bảo đảm vector, như mảng, luôn sử dụng bộ nhớ liền kề. Ngoài ra, chúng ta có:

26.5.2 Lớp mẫu valarray

1 Lớp mẫu valarray là một mảng thông minh một chiều, với yếu tố được đánh số tuần tự từ zero. Nó là một đại diện của khái niệm toán học của một bộ đặt hàng giá trị.Ảo tưởng về chiều cao cao hơn có thể được tạo ra bởi thành ngữ quen thuộc của các chỉ số được tính toán, cùng với khả năng hỗ trợ mạnh mẽ được cung cấp bởi toán tử chỉ số tổng quát.

và tiếp tục:

26.5.2.3 truy cập yếu tố valarray

4 Tương tự như vậy, khái niệm & a [i] = & b [j] đánh giá là đúng cho bất kỳ! hai mảng a và b và cho bất kỳ size_t i và size_t j sao cho tôi nhỏ hơn độ dài của a và j nhỏ hơn le ngth của b. Thuộc tính này cho biết không có bí danh và có thể được sử dụng để tận dụng lợi thế bằng cách tối ưu hóa trình biên dịch.

+0

Rất tiếc. Lấy làm tiếc. Không làm rõ câu hỏi của tôi đủ nhanh. +1 anyways. –

+0

'valarray' được dự định chứa các mảng đa chiều mà không làm tổ. 'valarray >' chỉ cần thiết cho một mảng ma trận/mảng có kích thước khác nhau. – Potatoswatter

+0

Wow, cảm ơn trích dẫn chuẩn! :-) –

0

Nếu bạn muốn kiểm tra mảng đa chiều là khối tiếp giáp (cột x hàng). Bạn có thể xem ví dụ này với valarray.

template<class T> 
class Array: public std::valarray<T> { 
    size_t row,col; 
public: 
    Array(){} 
    Array(size_t nx) : std::valarray<T>(nx){row=nx,col=1;} 
    Array(size_t nx, size_t ny) : std::valarray<T>(nx*ny){row=nx,col=ny;} 
    virtual ~Array(){} 
    T& operator()(size_t i,size_t j) { return (*this)[i*col+j];} 
    size_t Size(size_t n) const { return (n<2) ? col: row;} 
};