我有一个矩阵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循环列。是否可以很好地矢量化?
答案 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,:);