矢量化二次扩展

时间:2014-06-10 21:52:37

标签: arrays matlab vectorization

我有一个矩阵X,矢量在n列中。在我的例子中,这是一系列时间向量(第1列是t1,第2列是t2 ......)。我想返回一个新的矩阵Y,使得每个X(:,i)

Y(:,i)= [X(1,i)^ 2,X(1,i)* X(2,i),... X(n-1,i)* X(n, i),X(n,i)^ 2];

目前我通过计算外积X(:,i)* X(:,i)'来做到这一点,然后使用triu()返回上三角矩阵,最后用nonzeros()得到结果的非零元素:

Y(:,i)=非零(triu(X(:,i)* X(:,i)'));

我仍在使用for循环列。是否可以很好地矢量化?

1 个答案:

答案 0 :(得分:2)

如果您不介意丢失triu部分(即获取重复值);

Y = reshape(bsxfun(@times, permute(X,[1 3 2]), permute(X,[3 1 2])), [],size(X,2))

删除重复的Y行,对应X - 行对的对称值(相当于nonzeros(triu)):预先计算要保留的行的模式,然后用它来修剪Y

keep = nonzeros(triu(reshape(1:size(X,1)^2, size(X,1),size(X,1))));
Y = Y(keep,:);