2012-11-30 74 views
6

Tôi có một mảng ô là cell(1, n) được gọi là A, với mỗi mục nhập ô có chứa ma trận mxn. Vì vậy, trong thực tế, mảng ô của tôi chứa n ma trận có kích thước mxn.Nhân ma trận trong mảng ô Matlab?

Sau đó tôi có một mảng ô khác được gọi là B, với npxm ma trận được lưu trữ trong đó.

Những gì tôi cần làm là nhân hai cái với nhau, như sau: A[1] * B[1], A[2] * B[2], ..., A[n] * B[n]. Sau đó tôi cần lưu trữ các kết quả dưới dạng các ma trận riêng lẻ và tổng hợp chúng.

Các ma trận là conformal cho phép nhân, nhưng vì mảng tế bào B chứa hàng ít hơn mảng tế bào A, khi tôi sử dụng cellfun(@times A, B, 'UniformOutput', true) tôi nhận được một lỗi unequal matrices.

Điều này dường như chỉ ra rằng cellfun chỉ có thể nhân các ô riêng lẻ khi ma trận có số hàng và cột bằng nhau.

Bây giờ, tôi có thể thực hiện điều này bằng cách sử dụng các vòng lặp khác nhau hoặc bằng cách gọi cell2matmat2cell, v.v. Tôi cũng có thể lưu trữ mọi thứ dưới dạng mảng ma trận thay vì sử dụng các ô ... nhưng - tôi muốn sử dụng các ô.

Vì vậy - câu hỏi của tôi là: Có cách nào tốt để thực hiện việc này chỉ bằng cách sử dụng cellfun? Tôi đã thử kết hợp các đầu vào đối số khác nhau - nhưng không có may mắn cho đến nay.

Trả lời

2

Để làm điều này với cellfun, chỉ cần xác định chức năng ẩn danh của riêng bạn:

C = cellfun(@(a,b) a*b, A, B, 'UniformOutput', 0); 

Bây giờ, khi bạn đặt câu hỏi, bạn không thể nhân A * B, vì kích thước bên không đồng ý. Thay vào đó, tôi đã thử nghiệm điều này với B * A, trong đó kích thước đồng ý: p = 1, m = 3, n = 3.

A = {eye(3), rand(3), magic(3)}; 
B = {[1 2 3], [3 5 1], [7 8 8]}; 

C = cellfun(@(a,b) b*a, A, B, 'UniformOutput', 0); 

Cmat = cat(3, C{:}); 
S = sum(Cmat, 3); 

Tổng được thực hiện bằng cách ghép từng mảng của C trên một chiều thứ ba sau đó tổng hợp trên nó.

2

Có, đối số cần phải có cùng kích thước. Từ help cellfun:

A = cellfun (FUN, B, C, ...) đánh giá FUN sử dụng các nội dung của tế bào của mảng tế bào B, C, ... như các đối số đầu vào. Thành phần (I, J, ...) thứ của A bằng FUN (B {I, J, ...}, C {I, J, ...}, ...). B, C, ... tất cả phải có cùng kích thước.

Vì vậy, hoặc sử dụng các vòng lặp, hoặc loại bỏ các yếu tố phụ từ các tế bào với một số lượng lớn các yếu tố trước khi bạn gọi cellfun:

% assuming B has more elements than A 
B(numel(A)+1:end) = []; 
+0

Đáng tiếc là tôi không thể xóa các cột phụ trong ma trận. Các ma trận trong các tế bào là không đồng đều tức là không có cùng kích thước nhưng phù hợp với phép nhân, cả hai mảng tế bào có lưu số nguyên tố chỉ là ma trận khác nhau và tế bào (@times ,,,,) không cho phép nhân địa điểm. Cảm ơn rất nhiều vì đã trả lời bất kể :) – James