将矢量数组相互乘以

时间:2013-09-22 21:53:35

标签: arrays matlab matrix

我有三个时间序列数组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上确实不太了解所有的微分差异,但速度和内存性能是一个问题。

2 个答案:

答案 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)

您可以按照以下方式执行此操作。由于函数bsxfunpermute对于Matlab初学者来说可能并不明显,我建议您在需要时查看他们的文档(参见上面的链接)。

鉴于三个数据向量abc,请按以下步骤操作:

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中的结果。