2012-11-29 5 views
4

벡터 CD1 (120x1)이고은 6 부분으로 나뉘어 있습니다. 예를 들어 첫 번째 부분은 CD1에서 행 1에서 행 20까지 추출되고 두 번째 부분은 CD1에서 행 21에서 40까지 추출됩니다. 각 부분에 대해 second differences of the data의 절대 값 평균을 계산해야합니다. 그것이 내가하고 싶은 일을하도록 코드를 변경인덱싱은 인덱스 표현식의 마지막에 나타나야합니다.

()-indexing must appear last in an index expression for Line:2 

어떤 아이디어 :

for PartNo = 1:6 

    % extract data     
    Y(PartNo) = CD1(1 + 20*(PartNo-1):20*(PartNo),:); 

    % find the second difference 
    Z(PartNo) = Y(PartNo)(3:end) - Y(PartNo)(1:end-2); 

    % mean of absolute value 
    MEAN_ABS_2ND_DIFF_RESULT(PartNo) = mean(abs(Z));  

end 

그러나, 명령은 위의 오류가 발생?

+0

이 아닌'Y (PARTNO)가'스칼라 ? 그리고 벡터는 벡터입니까? – Xyand

+0

RHS 벡터입니다 .. –

+0

이렇게 쓰는 것의 의미는 무엇입니까 :'Y (1) = [1 2 3]'? 그리고 나중에'Y (1) (3 : end)'- 스칼라 색인 생성? – Xyand

답변

7

Y이 셀 배열 인 경우이 오류가 자주 발생합니다. 셀 어레이의 경우

Y{1}(1:3) 

은 유효합니다. 중괄호 ({})는 데이터 추출을 의미하므로 은 셀 배열의 위치 1에 저장된 배열을 추출한 다음 해당 배열의 요소 1 ~ 3을 참조합니다.

표기

Y(1)(1:3) 

그것이 데이터를 추출하지 않는다는 점에서 다르지만, 참조 셀의 위치 1. 이것은 (Y(1))을 첫 번째 부분 수단 셀을 반환 -array하는 귀하의 경우, 하나의 배열을 포함합니다. 따라서 이전과 같이 일반 배열에 직접 액세스 할 수 없습니다.

Matlab에서 간접 또는 이중 참조를 수행 할 수 없다는 것은 악명이 높습니다. 이는 실제로 여기서 한 일입니다.

따라서 오류가 발생했습니다. 이제

는 해결하려면

Y{PartNo} = CD1(1+20*(PartNo-1):20*PartNo,:); % extract data 
Z{PartNo} = Y{PartNo}(3:end)-Y{PartNo}(1:end-2); % find the second difference 
MEAN_ABS_2ND_DIFF_RESULT{PartNo} = mean(abs(Z{PartNo})); % mean of absolute value 
3

내가이 유효한 문이 아닌 다른 방법

Y = reshape(CD1, 20, 6); 
Z = diff(y(1:2:end,:)); 
MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z)); 
3

을 제안 할 수 있습니다 나는 트릭을 할 것 곱슬 사람과 몇 정상 괄호를 교체 의심하는 matlab에 :

Y(PartNo)(3:end) 

Y 하시다 차원과는이 색인

Y(PartNo, 3:end) 

를 사용하거나 벡터 부분을 추출하고 루프를 사용하는 경우이 또한

for PartNo = 1:6 

    % extract data     
    Y = CD1(1 + 20*(PartNo-1):20*(PartNo),:); 

    % find the second difference 
    Z = Y(3:end) - Y(1:end-2); 

    % mean of absolute value 
    MEAN_ABS_2ND_DIFF_RESULT(PartNo) = mean(abs(Z));  
end 

을 보여 주었다처럼 CD1가 벡터이기 때문에, 당신이하지 않는, 직접 사용 두 번째 차원을 색인화해야합니다. :

Y = CD1(1 + 20*(PartNo-1):20*(PartNo)); 

마지막으로 루프가 필요하지 않습니다.당신은 열이 부품이있는 크기 20x6의 2 차원 배열 Y,에 CD1 벡터를 reshape, 그 결과 행렬에 직접 작업 할 수 있습니다

Y = reshape(CD1, 20, 6); 
Z = Y(3:end,:)-Y(1:end-1,:); 
MEAN_ABS_2ND_DIFF_RESULT = mean(abs(Z)); 
관련 문제