我有三个时间序列数组a,b,c,每个数组包含1000个值。它们组成一个矩阵A.
现在,我想取每个数组并逐点将它与每个其他数组相乘,这样我就得到9个新的向量a ^ 2,ab,ac,ba,b ^ 2,bc,ca,cb,cc。< / p>
当我这样做时,我想将这9个新阵列组合成81个新阵容。
我该怎么做?就像我说的那样,我尝试构建一个矩阵,但它并不像我想要的那样工作。我希望A被认为是1 * 3矩阵,包含1000 * 1阵列。因为它现在只是连接一切。如果A是包含数组的1 * 3矩阵,我可以构建矩阵B =转置(A)* A,它将包含所有产品
我尝试过像
这样的事情A = [[a] [b] [c]]
A = {a b c}
A = {a; b; c}
defining a, b and c as a = {1, 2, 5, 2 , 1 ...} instead of [1, 2, 5, 2 , 1 ...]
但它们都不起作用。
我不在乎a,b,c,d是否存储为列表,列数组,行数组或单元格,而且我在matlab上确实不太了解所有的微分差异,但速度和内存性能是一个问题。
答案 0 :(得分:3)
此问题缩小为创建索引对。
%Simulate random data
X=rand(1000,3);
%Create index multiplication pairs
[i,j] = meshgrid(1:size(X,2),1:size(X,2))
%Multiply together
X = X(:,i(:)).*X(:,j(:));
在这种情况下,您将获得以下成对列相乘
[i(:)';j(:)'] =
1 1 1 2 2 2 3 3 3
1 2 3 1 2 3 1 2 3
您可以重复此过程进行重新传输。但请注意:矩阵大小将在迭代次数中呈指数级增长。
答案 1 :(得分:3)
您可以按照以下方式执行此操作。由于函数bsxfun
和permute
对于Matlab初学者来说可能并不明显,我建议您在需要时查看他们的文档(参见上面的链接)。
鉴于三个数据向量a
,b
,c
,请按以下步骤操作:
A = [ a(:) b(:) c(:) ]; % matrix from column vectors
P = bsxfun(@times,A,permute(A,[1 3 2])); % desired result
结果P
是一个包含所需产品的1000x3x3阵列。 P
的第二和第三个索引以明显的方式解释:1对应a
,2对应b
,3对应c
。例如,P(10,1,2)
为a(10)*b(10)
; P(50,3,3)
是c(50)^2
;等等。
要迭代:只需将reshape
P
转换为新的A2
矩阵并重复此过程:
A2 = reshape(P,[1000,9,1]);
P2 = bsxfun(@times,A2,permute(A2,[1 3 2])); % result
这将得到1000x9x9数组P2
中的结果。