2013-01-16 28 views
9

Tôi muốn tính y = a⊗a⊗a, trong đó a là véc tơ n-by-1 và outer product operator. Trong trường hợp này, y phải là một dây dẫn n-by-n-by-n.Làm thế nào để lấy sản phẩm bên ngoài của nhiều hơn hai ma trận trong một lần chụp, trong MATLAB?

Nếu y = a⊗a, thật dễ dàng. Tôi chỉ cần làm:

y = a * a' 

Nhưng phải làm gì trong trường hợp đầu tiên? Làm cách nào để tính toán sản phẩm bên ngoài hiệu quả trong MATLAB nếu có nhiều hơn hai vectơ?

+0

Tôi không hiểu những gì bạn muốn tính toán. Có phải 'y = a x a x a'? Nếu vậy, sản phẩm bên ngoài được định nghĩa như thế nào khi một trong các toán hạng là ma trận? –

+0

Có, tôi muốn tính toán y = a x a x a. Hoặc những thứ tự cao hơn như, y = a x a x a x a x a. –

Trả lời

6

Trong một đa chiều (tensor) Trường hợp y = u⊗v, tôi tin rằng bạn cần phải thay đổi kích thước của các toán hạng thứ hai như vậy:

v_t = permute(v, circshift(1:(ndims(u) + ndims(v)), [0, ndims(u)])); 

và sau đó nhân chúng với bsxfun:

y = bsxfun(@times, u, v_t); 

Phép nhân ma trận thông thường chỉ được xác định cho ma trận vector và 2-D, vì vậy chúng tôi không thể sử dụng nó trong trường hợp chung. Cũng cần lưu ý rằng tính toán này vẫn không thành công nếu toán hạng thứ hai là một véc tơ 1-D, bởi vì ndims trả về 2 thay vì 1 cho vec-tơ. Với mục đích này, cho phép xác định chức năng của chúng ta mà đếm kích thước:

my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x)); 

Để hoàn thành câu trả lời, bạn có thể định nghĩa một hàm mới (. ví dụ một chức năng ẩn danh), như vậy:

outprod = @(u, v)bsxfun(@times, u, permute(v, circshift(1:(my_ndims(u) + my_ndims(v)), [0, my_ndims(u)]))); 

và sau đó sử dụng nó bao nhiêu lần tùy thích. Ví dụ, y = a×a×a sẽ được tính như sau:

y = outprod(outprod(a, a), a); 

Tất nhiên, bạn có thể viết một hàm tốt hơn mà phải mất một số biến của tham số để giúp bạn tiết kiệm một số cách gõ. Nội dung nào đó dọc theo các dòng sau:

function y = outprod(u, varargin) 
    my_ndims = @(x)(isvector(x) + ~isvector(x) * ndims(x)); 
    y = u; 
    for k = 1:numel(varargin) 
     v = varargin{k}; 
     v_t = permute(v, circshift(1:(my_ndims(y) + my_ndims(v)),[0, my_ndims(y)])); 
     y = bsxfun(@times, y, v_t); 
    end 

Tôi hy vọng tôi có quyền tính toán!

3

Bạn có thể sử dụng cũng như các chức năng kron:

kron(a * a', a) 

hoặc khi bốn bên ngoài (Kronecker tensor) sản phẩm cần thiết:

kron(kron(a * a', a), a) 

và vân vân. Phần cuối cùng cung cấp cho bạn ma trận m x n, trong đó m = n * n * n.

Nếu thêm kích thước là mong muốn như đang xảy ra với các sản phẩm, bạn có thể sử dụng chức năng reshape:

reshape(kron(a * a', a), [n, n, n]) 

hoặc

reshape(kron(kron(a * a', a), a), [n, n, n, n]) 

và vân vân.Người cuối cùng cung cấp cho bạn n x n x n x n độ bền.

2

Sự cố khi sử dụng kron như trong a previous solution là nó sẽ loại bỏ việc lập chỉ mục chuẩn của sản phẩm bên ngoài.

Thay vào đó, ndgrid là lý tưởng cho kịch bản này:

a = [1; 2; 3]; 
b = [4; 5]; 
c = [6; 7; 8; 9]; 

[xx, yy, zz] = ndgrid(1:length(a), 1:length(b), 1:length(c)); 

% desired outerproduct 
M = a(xx) .* b(yy) .* c(zz); 

Trên giấy tờ, chúng ta có thể kiểm tra xem các giải pháp mong muốn M là datacube:

M(:,:,1) = | M(:,:,2) = | M(:,:,3) = | M(:,:,4) = 
      |   |   | 
24 30 | 28 35 | 32 40 | 36 45 
48 60 | 56 70 | 64 80 | 72 90 
72 90 | 84 105 | 96 120 | 108 135 

Sử dụng cách tiếp cận sản phẩm Kronecker

M2 = reshape(kron(a * b', c), [length(a), length(b), length(c)]); 

chúng tôi sẽ nhận được:

M2(:,:,1) = | M2(:,:,2) = | M2(:,:,3) = | M2(:,:,4) = 
      |    |    | 
24 36 | 64 84 | 30 45 | 80 105 
28 48 | 72 96 | 35 60 | 90 120 
32 56 | 72 108 | 40 70 | 90 135 

Datacube M2 có các yếu tố tương tự như M, nhưng những yếu tố này sắp xếp lại. Điều này là do kron(a * b', c) không chứa các lát của M trong các khối tiếp giáp để tạo điều kiện cho việc áp dụng trực tiếp chức năng reshape. Để tính toán sản phẩm bên ngoài theo cách này, chúng tôi sẽ cần phải áp dụng một chức năng/chức năng sắp xếp lại (có thể xác định, nhưng tốn kém và mất thời gian) cho các phần tử của kron(a * b', c).

Một lợi thế nữa của việc sử dụng ndgrid là nó tổng quát dễ dàng với các đơn đặt hàng cao hơn.

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