📄 khatrirao.m
字号:
function P = khatrirao(varargin)%KHATRIRAO Khatri-Rao product of matrices.%% KHATRIRAO(A,B) computes the Khatri-Rao product of matrices A and% B that have the same number of columns. The result is the% column-wise Kronecker product% [KRON(A(:,1),B(:,1)) ... KRON(A(:,n),B(:,n))]%% KHATRIRAO(A1,A2,...) computes the Khatri-Rao product of% multiple matrices that have the same number of columns.%% KHATRIRAO(C) computes the Khatri-Rao product of% the matrices in cell array C.%% KHATRIRAO(...,'r') computes the Khatri-Rao product in reverse% order.%% Examples% A = rand(5,2); B = rand(3,2); C = rand(2,2);% khatrirao(A,B) %<-- Khatri-Rao of A and B% khatrirao(B,A,'r') %<-- same thing as above% khatrirao({C,B,A}) %<-- passing a cell array% khatrirao({A,B,C},'r') %<-- same as above%% See also TENSOR, KTENSOR.%%MATLAB Tensor Toolbox.%Copyright 2007, Sandia Corporation. % This is the MATLAB Tensor Toolbox by Brett Bader and Tamara Kolda. % http://csmr.ca.sandia.gov/~tgkolda/TensorToolbox.% Copyright (2007) Sandia Corporation. Under the terms of Contract% DE-AC04-94AL85000, there is a non-exclusive license for use of this% work by or on behalf of the U.S. Government. Export of this data may% require a license from the United States Government.% The full license terms can be found in tensor_toolbox/LICENSE.txt% $Id: khatrirao.m,v 1.11 2007/01/10 01:27:30 bwbader Exp $%% Error checking on input and set matrix order% Note that this next if/else check forces A to be a cell array.if ischar(varargin{end}) && varargin{end} == 'r' if nargin == 2 && iscell(varargin{1}) % Input is a single cell array A = varargin{1}; else % Input is a sequence of matrices A = {varargin{1:end-1}}; end matorder = length(A):-1:1;else if nargin == 1 && iscell(varargin{1}) % Input is a single cell array A = varargin{1}; else % Input is a sequence of matrices A = varargin; end matorder = 1:length(A);end%% Error check on matrices and compute number of rows in result % N = number of columns (must be the same for every input)N = size(A{1},2); % After loop, M = number of rows in the resultM = 1; for i = matorder if ndims(A) ~= 2 error('Each argument must be a matrix'); end if (N ~= size(A{i},2)) error('All matrices must have the same number of columns.') end M = M * size(A{i},1);end%% Computation% PreallocateP = zeros(M,N);% Loop through all the columnsfor n = 1:N % Loop through all the matrices ab = A{matorder(1)}(:,n); for i = matorder(2:end) % Compute outer product of nth columns ab = A{i}(:,n) * ab(:).'; end % Fill nth column of P with reshaped result P(:,n) = ab(:); end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -