2013-09-22 4 views
2

나는 각각 1000 개의 값으로 구성된 세 개의 시계열 a, b, c를가집니다. 그것들은 행렬을 구성합니다.벡터 배열에 서로 곱하기

이제 각 배열을 가져 와서 점 적으로 다른 모든 배열에 곱하면 9 개의 새로운 벡터^a, b, ac, ba, b^2, bc를 얻고 싶습니다. , ca, cb, cc.

이 작업을 마치면이 9 개의 새로운 배열을 81 개의 새로운 배열로 결합하려고합니다.

어떻게하면됩니까? 내가 말했듯이, 나는 행렬을 만들려고했으나 그것이 원하는대로 작동하지 않습니다. A가 1000 * 1 배열을 포함하는 1 * 3 행렬로 인식되기를 바랍니다. 이제는 모든 것을 연결합니다. A는 배열을 포함하는 1 * 3 매트릭스라면 * A I가

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 ...] 

하지만 아무도 같은 것들을 시도했습니다

모든 제품을 포함 할 것이다, 난 그냥 = 행렬 B를 만들 수 (A) 트랜스 그 (것)들은 일한다.

a, b, c, d가 목록, 열 배열, 행 배열 또는 셀로 저장되어 있는지 신경 쓰지 않고 모든 subtile 차이를 알기에 matlab에서 충분히 좋지는 않지만 속도는 중요하지 않습니다. 그리고 메모리 성능은 일종의 문제입니다.

+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(:)); 

당신은 프로세스가 remultiply을 반복 할 수 있습니다 함께

[i(:)';j(:)'] = 
1  1  1  2  2  2  3  3  3 
1  2  3  1  2  3  1  2  3 

곱한. 그러나 조심해라. 행렬 크기는 반복 횟수에 따라 기하 급수적으로 증가 할 것이다.

+0

감사합니다. 이것은 내가 원하는 것을 정확하게 수행하는 것 같습니다. 나는 마지막 라인에서 어떤 일이 일어나는지 전혀 모른다. 숫자 대신 배열에서 작동하는 행렬을 갖는 위의 문제와 관련하여 어떤 생각을 갖고 있습니까? (나는 일종의 관련이기 때문에 나는 새로운 질문을 만들지 않았다). – user1661303

+0

@ user1661303 초기 질문을 만족하는 경우 정답으로 표시하십시오. 두 번째 질문에 관하여 : 당신이 의미하는 바가 내게 명확하지 않기 때문에 질문을 다시 말해야 할 것입니다. – twerdster

+0

으로 표시했습니다. 다른 질문은 초기 게시물에 나와 있는데, 나는 아직 해결되지 않은 것으로 표시하지 않았습니다. 행렬을 1 * 3 행렬로 사용하려면 3 개의 항목 만 숫자가 아니어야합니다. 즉 배열을 캡슐화하고 싶습니다. 그러나 어쩌면 너무 모호하게 공식화 된 것일 수도 있습니다. 내일 그것에 대해 새로운 질문을 게시 할 것입니다. – user1661303

3

다음과 같이 할 수 있습니다. bsxfunpermute 함수는 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의 결과를 준다.