Tôi đã tự hỏi về câu hỏi này trong một thời gian nhưng không thể tìm thấy một tham chiếu: Làm thế nào để Matlab transpose một ma trận thưa thớt quá nhanh, cho rằng nó được lưu trữ trong CSC (nén thưa thớt cột) định dạng?Làm thế nào để Matlab transpose một ma trận thưa thớt?
Cũng its documentation xác minh tính hiệu quả của chuyển vị ma trận thưa thớt:
Để làm điều này (truy cập vào từng hàng), bạn có thể transpose ma trận, thực hiện các hoạt động trên các cột, và sau đó retranspose kết quả ... Hiện cần thiết để chuyển đổi ma trận là không đáng kể.
Follow-up (sửa đổi theo đề nghị của @Mikhail):
Tôi đồng ý với @Roger và @Milhail rằng cài đặt một lá cờ là đủ cho nhiều hoạt động như các hoạt động BLAS hoặc BLAS thưa thớt về giao diện của họ. Nhưng nó xuất hiện với tôi rằng Matlab thực sự chuyển đổi "thực tế". Ví dụ, tôi có một ma trận X thưa thớt với kích thước m * n = 7984 * 12.411, và tôi muốn mở rộng mỗi cột và mỗi hàng:
% scaling each column
t = 0;
for i = 1 : 1000
A = X; t0 = tic;
A = bsxfun(@times, A, rand(1,n));
t = t + toc(t0);
end
t = 0,023636 giây
% scaling each row
t = 0;
for i = 1 : 1000
A = X; t0 = tic;
A = bsxfun(@times, A, rand(m,1));
t = t + toc(t0);
end
t = 138.3586 giây
% scaling each row by transposing X and transforming back
t = 0;
for i = 1 : 1000
A = X; t0 = tic;
A = A'; A = bsxfun(@times, A, rand(1,m)); A = A';
t = t + toc(t0);
end
t = 19,5433 giây
kết quả này có nghĩa là truy cập vào cột theo cột nhanh hơn truy cập hàng theo hàng. Nó có ý nghĩa bởi vì ma trận thưa thớt được lưu trữ theo từng cột. Vì vậy, lý do duy nhất cho tốc độ nhanh của tỷ lệ cột của X 'nên X thực sự được chuyển sang X' thay vì đặt cờ.
Ngoài ra, nếu mọi ma trận thưa thớt được lưu trữ ở định dạng CSC, chỉ cần đặt cờ không thể tạo X 'ở định dạng CSC.
Mọi nhận xét? Cảm ơn trước.
Nó có thể chỉ đặt cờ kiểm soát hành vi truy cập mảng của nó - trao đổi chỉ mục hàng/cột trên truy cập và để lại dữ liệu đơn lẻ là rất nhanh. –
@RogerRowland Vui lòng xem phần tiếp theo tôi đã thêm ở trên. Cảm ơn. –
Tôi muốn đề xuất thực hiện một số thử nghiệm. 20 mili giây không phải là một phép đo thời gian đáng tin cậy. – Mikhail