2010-06-09 29 views
5

Tôi muốn tạo một số dữ liệu đại diện cho tọa độ của một đám mây các điểm biểu diễn một khối n của các chiều không gian. Những điểm này nên được phân bố đều trên toàn bộ không gian n và sẽ có thể được tạo ra với khoảng cách do người dùng xác định giữa chúng. Dữ liệu này sẽ được lưu trữ trong một mảng.C++ Cách tạo tập hợp các sản phẩm Descartes của các bộ dữ liệu n chiều

+0

là bài tập về nhà này? – Cetra

+0

không có lợi ích cá nhân này. – Ben

Trả lời

2

Tôi đã tìm thấy việc triển khai cartesian product using Boost.MPL.

Có một sản phẩm Cartesian thực tế trong Boost cũng nhưng đó là một chỉ thị tiền xử lý, tôi cho rằng nó không sử dụng cho bạn.

+0

Chúc mừng đó là một ví dụ hữu ích cho tôi để đọc mặc dù, mặc dù nó không hoàn toàn trả lời câu hỏi của tôi hoàn toàn. – Ben

1

Để giữ mọi thứ đơn giản, đây là ví dụ cho hình lập phương thông thường, nghĩa là một hình có 3 kích thước. Hãy để nó có chiều dài bên 1 và giả sử bạn muốn các điểm cách nhau trong khoảng thời gian 1/n. (Điều này dẫn đến việc phân phối các điểm hình chữ nhật thống nhất, không hoàn toàn chắc chắn rằng đây là những gì bạn muốn).

Bây giờ một số mã giả:

for i=0;i<=n;i++ //NB i<=n because there will be n+1 points along each axis-parallel line 
    for j=0;j<=n;j++ 
     for k=0;k<=n;k++ 
      addPointAt(i/n,j/n,k/n) //float arithmetic required here 

Lưu ý rằng đây không phải là sản phẩm Descartes của bất cứ điều gì nhưng dường như đáp ứng (trường hợp đặc biệt của) tiêu chí của bạn. Nếu bạn muốn các điểm cách nhau khác nhau, hãy điều chỉnh chỉ số bắt đầu và kết thúc vòng lặp hoặc kích thước khoảng thời gian.

Để khái quát hóa điều này với bất kỳ thứ nguyên nào được chỉ định cao hơn dễ dàng, hãy thêm các vòng lặp khác.

Để khái quát hóa bất kỳ thứ nguyên nào cao hơn mà không được biết cho đến khi thời gian chạy chỉ khó khăn hơn một chút. Thay vì khai báo một mảng N-chiều, khai báo một mảng 1-D với cùng một số phần tử. Sau đó, bạn phải viết số học chỉ mục một cách rõ ràng thay vì có trình biên dịch viết nó cho bạn.

Tôi mong rằng bạn sẽ cho tôi biết rằng đây không phải là điều bạn muốn! Nếu nó không phải là bạn có thể làm rõ.

+0

Đây là những gì tôi muốn nhưng những gì tôi đang theo đuổi là một giải pháp chung cho điều này, chứ không phải là một giải pháp cụ thể. Đây cũng là những gì tôi đang theo đuổi. Một người bạn lặp lại câu hỏi cho tôi. Đó là một trong những khó khăn cho tôi để giải thích như tôi không có bất kỳ nền tảng trong hình học vượt quá 3 chiều. – Ben

+0

@Ben: OK, vì vậy giải pháp chung là bạn tạo một mảng 1-D là biểu diễn 'phẳng' của mảng N-D của bạn. –

+0

Tôi đã tự hỏi làm thế nào để thực hiện đệ quy n chiều sâu mặc dù để tôi có một cách chung chung để tạo ra các tọa độ cho tất cả các kích thước n. Có một chức năng tự gọi là một cách tôi nghĩ đến nhưng điều này có vẻ không cần thiết và lộn xộn. – Ben

0

Bạn có thể làm điều này một cách đệ quy (giả):

Function Hypercube(int dimensions, int current, string partialCoords) 
{ 
    for i=0, i<=steps, i++ 
    { 
    if(current==dimensions) 
     print partialCoords + ", " + i + ")/n"; 
    else if current==0 
     Hypercube(dimensions, current+1, "("+i); 
    else 
     Hypercube(dimensions, current+1, partialCoords+", "+i); 
    } 

} 

Bạn gọi nó là: Hypercube (n, 0, ""); Điều này sẽ in tọa độ của tất cả các điểm, nhưng bạn cũng có thể lưu trữ chúng trong một cấu trúc.

Các vấn đề liên quan