2013-09-22 62 views
2

我有三个时间序列数组a,b,c,每个数组由1000个值组成。他们组成一个矩阵A.乘以彼此的向量阵列

现在,我想要采取每个数组,并逐点乘以它到每一个其他数组,所以我会得到9个新的向量a^2,ab,ac,ba,b^2,bc ,ca,cb,cc。

当我这样做时,我想将这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中确实不够好,无法知道所有的subtile差异,但速度内存性能是一个问题。

+0

在矩阵运算符之前放置一个点“。”以使其成为元素明确的,例如, 'a。^ 2','a。* b'。 –

+0

对不起,但我想要数组相乘,而不是自己。也许我不清楚,但我正在寻找某种自动的方式来组合阵列。实际上,我会有三个以上的信号,可能有数百个信号,所以如果每个组合都写出来就太乏味了。 我想按照元素的方式进行计算,但首先我希望将数组组合为“矩阵式”。 – user1661303

+0

理想情况下,我想有一个矩阵,其行为与矩阵完全一样,除了它具有数组(或列表或向量)作为条目并且+和*被重载的情况下 如果我可以进行矩阵乘法这样A * B的第一个条目就是a11 * b12 + a12 * b21,其中a11等于是一个向量,a11 * b12是分段相乘 – user1661303

回答

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 

您可以重复这一过程,以remultiply。但要小心:矩阵大小将在迭代次数中呈指数增长。

+0

谢谢,这似乎正是我想要的。我不知道最后一行发生了什么,但它的工作原理。 有什么办法解决上述问题,让矩阵在数组而不是数字上工作? (我没有创建一个新的问题,因为它有点相关)。 – user1661303

+0

@ user1661303如果满足您的初始问题,请将其标记为正确答案。关于你的第二个问题:你需要重新解释你的问题,因为我不清楚你的意思。标记为 – twerdster

+0

。另一个问题是在最初的帖子中,这就是为什么我没有把它标记为已解决。我希望矩阵表现为1 * 3矩阵,只有3个条目不应该是数字,而是数组,即我想封装数组。但也许它太模糊了。明天将会发布一个关于它的新问题。 – user1661303

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;等等。

要迭代:简单地reshapeP到一个新的矩阵A2和重复过程:

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

这给出结果的1000x9x9阵列P2英寸