Matrix Basis扩展

时间:2015-11-03 00:39:12

标签: matlab

MATLAB:

我正在尝试对一个巨大的矩阵(1000x15)进行基础扩展。 例如,

X =

x1   x2

1    4

2    5

3    6

我想建立一个新的矩阵。

Y =

x1   x2    x1*x1   x1*x2   x2*x2

1    4       1       4       16

2    5       4       10      25

3    6       9       18      36

请有人建议更简单的方法吗

2 个答案:

答案 0 :(得分:2)

% your input
A = [1 4; 2 5; 3 6];

% generate pairs
[p,q] = meshgrid(1:size(A,2), 1:size(A,2));

% only retain unique pairs
ii = tril(p) > 0;

% perform element wise multiplication
res = [A A(:,p(ii)) .* A(:,q(ii))];

答案 1 :(得分:1)

使用this answer中的单线程来获得索引的2组合,您可以使用

生成没有交错排序的矩阵
function Y = columnCombo(Y)
    comb  = nchoosek(1:size(Y,2),2);
    Y     = [Y , Y.^2 , Y(:,comb(:,1)).*Y(:,comb(:,2))];
end

对于交错排序,我想出了这个可能是次优的解决方案:

function Y = columnCombo(Y)

    [m,n] = size(Y);
    comb  = nchoosek(1:n,2);
    Y     = [Y,zeros(m,n + size(comb,1))];

    col = n+1;
    for k = 1:n-1
        Y(:,col) = Y(:,k).*Y(:,k)                       ;
        ms       = comb(comb(:,1)==k,:)                 ;
        ncol     = size(ms,1)                           ;
        Y(:,col+(1:ncol)) = Y(:,ms(:,1)).*Y(:,ms(:,2))  ;
        col = col + ncol + 1                            ;
    end
    Y(:,end) = Y(:,n).^2;

end