我有一个n×m的矩阵。设该矩阵的某一行为x。每一行代表一个数字的功能x1, x2, x3, ...
获取所有矩阵行列的所有双因子产品
现在,我想收到上述对角线x * x'
,即元素:x1*x2, x1*x3, x2*x3
,...但不x1*x1
。另外,如果我有x1*x2
,我不需要x2*x1
。
我想将这些列与产品添加到我的矩阵。鉴于我以前有过m
列,我将为这些产品添加更多列,即:(m^2 + m)/2 - m
更多列。
这应该为我的矩阵的每一行完成。
我已经在Matlab中找到了解决方案。然而,它似乎很慢,我想知道是否有更多矢量化解决方案可供Matlab使用,可以更快地执行。
我目前的解决方案使用一个包来获得高于上对角线元素的矢量:https://de.mathworks.com/matlabcentral/fileexchange/23391-triangular-and-diagonal-indexing
矩阵M
会给我我的矩阵在对角线之上的元素M(itriu(size(M),1))
。例如,如果我抛出[1 2 3; 4 5 6; 7 8 9]
,我将得到2 3 6
。
我的代码如下:
function [ X_out ] = permutateFeatures(X_in)
%PERMUTATEFEATURES given a matrix with m features in the columns
% and n samples in the rows, return a [n (m^2 + m)/2] matrix
% where each additional column contains a element-wise product of two of
% the original columns
n = size(X_in, 1);
m = size(X_in, 2);
X_out = [X_in zeros(n, (m^2 + m)/2 - m)];
for i = 1:n
outerProduct = X_out(i,1:m)' * X_out(i,1:m);
X_out(i,:) = [X_in(i,:) outerProduct(itriu(size(outerProduct),1))'];
end
end
有没有更有效的解决方案?
尺寸参数'n'和'm'的典型值是什么? – Divakar
@Divakar'm'相当小,大部分都是'<20'。 'n'进入百万 – IceFire