2013-06-28 36 views
6

Tôi có một vectơ các số nguyên và tôi muốn xây dựng một ma trận đường chéo với phần tử vectos như các mục chéo của ma trận. Ví dụ: nếu vector là 1 2 3 ma trận đường chéo sẽ là:Xây dựng một ma trận đường chéo từ vectơ số nguyên: hàm eigen

1 0 0 
0 2 0 
0 0 3 

Cách ngây thơ để làm điều đó sẽ chỉ lặp trên nó và thiết lập các yếu tố từng cái một. Không có cách nào khác trực tiếp để thực hiện việc này trong eigen. Ngoài ra sau khi xây dựng các đường chéo tôi muốn tính toán nghịch đảo (mà chỉ là đảo ngược các mục chéo) nhưng có vẻ không phải là một cách để làm điều này quá (trực tiếp, mà sẽ được tối ưu hóa cách quá) trong thư viện chính nó.

Tôi đã tra cứu tài liệu của diagonal matrices trong thư viện eigen nhưng có vẻ như không có cách nào. Nếu tôi đã bỏ lỡ điều gì đó hiển nhiên trong khi đọc tài liệu, vui lòng chỉ ra.

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Nếu bạn tìm thấy cách để nhanh chóng tạo ma trận từ vectơ, đảo ngược nó là khá đơn giản: Đảo ngược các phần tử của vectơ và tạo ma trận từ đầu. – arne

+0

@arne Tôi không muốn nhận được vào các lỗi dấu chấm động, nếu chúng có thể phát sinh (tôi không chắc chắn). Vì vậy, muốn eigen để xử lý tất cả mọi thứ. Tôi đoán điều đó sẽ dễ dàng. –

+0

Trang bạn đã liên kết đưa ra một hàm tạo 'DiagonaMatrix' 3D lấy 3 hệ số có liên quan làm đối số. Ngoài ra còn có một phương pháp để trích xuất các vector đường chéo ra khỏi một ma trận như vậy, mà bạn có thể sử dụng để tính toán "bằng tay" các vector đảo ngược và xây dựng một ma trận mới với. – didierc

Trả lời

10

Theo this part of the documentation bạn có khá một vài lựa chọn, cách đơn giản nhất là

auto mat = vec.asDiagonal(); 
+0

Tài liệu chính xác có thể khó tìm thấy đôi khi. Tôi đã tìm kiếm google nhưng điều này không hiển thị. Nghe có vẻ kì lạ nhưng thủ thuật/mẹo nào? –

+0

Tôi đã sử dụng truy vấn 'ma trận đường chéo từ vector eigen', vì vậy không có thủ thuật thực sự ở đây :) – filmor

+0

Liên kết tài liệu đã chết. – Cecilia

1

Bạn nên sử dụng các loại phù hợp với Eigen, trừ khi bạn thực sự biết những gì bạn đang làm

//Create a 4x4 diagonal matrix from the vector [ 5 6 7 8 ] 
Eigen::Vector4d vec; 
vec << 5, 6, 7, 8; 
Eigen::DiagonalMatrix<double, 4> mat = vec.asDiagonal(); 

Sử dụng tự động là một độ dốc thực sự trơn mà bạn thường không biết trình biên dịch sử dụng như kiểu gì và kết hợp với Eigen, đây là một trong những nguồn phổ biến của các lỗi khó tìm (xem https://eigen.tuxfamily.org/dox/TopicPitfalls.html)

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