2

我有三个时间序列数组 a、b、c,每个数组包含 1000 个值。它们组成一个矩阵 A。

现在,我想获取每个数组并逐点将其与其他数组相乘,这样我将得到 9 个新向量 a^2、ab、ac、ba、b^2、bc、ca、cb、cc。

完成此操作后,我想将这 9 个新数组组合成 81 个新数组。

我该怎么做呢?就像我说的,我尝试构建一个矩阵,但它并没有按照我想要的方式工作。我希望 A 被识别为包含 1000*1 数组的 1*3 矩阵。就像现在一样,它只是连接所有内容。如果 A 是一个包含数组的 1*3 矩阵,我可以构建矩阵 B = transpose(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 上真的不够好,无法知道所有细微差别,但速度和内存性能是有点问题。

4

2 回答 2

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

您可以重复该过程以重新繁殖。但要小心:矩阵大小会随着迭代次数呈指数增长。

于 2013-09-22T22:41:36.387 回答
3

您可以按如下方式进行。由于这些功能对于 Matlab 初学者bsxfun来说permute可能并不明显,因此我建议您在需要时查看他们的文档(请参阅上面的链接)。

给定三个数据向量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对应于 , b3对应于c。例如,P(10,1,2)a(10)*b(10)P(50,3,3)c(50)^2;等等。

迭代:只需进入一个新矩阵并重复过程:reshape PA2

A2 = reshape(P,[1000,9,1]);
P2 = bsxfun(@times,A2,permute(A2,[1 3 2])); % result

这给出了 1000x9x9 数组中的结果P2

于 2013-09-23T01:00:30.520 回答