2017-11-14 1 views
1

그래서 어떤 정수 a 대한 그 timeData(:,:,a) 데이터의 NX1 행렬이다 timeData 불리는 동적으로 업데이트 셀 어레이 불필요한 치수를 할당하고, 행 n 수가 a의 값에 따라 변한다 1 : 1 대응. 이를 위해 data이라는 nx1이라는 2D 데이터 배열을 생성합니다. 다음과 같이 할당 문은 for 루프 내에서 발생 : 내가 원하는대로MATLAB 자동 I는 3 차원 셀 어레이를 생성 할

% Before iterating, I define an array of indices where I want to store the 
% data sets in timeData. This choice of storage location is for 
% organizational purposes. 

A = [2, 5, 9, 21, 34, 100]; % Notice they are in ascending order, but have 
          % gaps that have no predictability. 
sizeA = size(A); 
numIter = A(1); 

for m = 1:numIter % numIter is the number of data sets that I need to store 
        % in timeData 

    % At this point, some code that is entirely irrelevant to my question 
    % generates a nx1 array of data. One example of this data array is below. 

    data = [1.1;2.3;5.5;4.4]; % This is one example of what data could be. Its 
          % number of rows, n, changes each iteration, as 
          % do its contents. 

    B = size(data); 
    timeData(1:B(1),1,A(m)) = num2cell(data); 
end 

이 코드는 timeData 내에서 적절한 위치에있는 데이터의 모든 내용을 넣어 않습니다. 그러나 해당 행 수가 n 인 모든 a에 대해 timeData(:,:,a)의 모든 2D 배열에 {0x0 double} 개의 행을 추가합니다. 따라서, 원하지 않는 10 ~ 2 백개의 0 값 행을 갖는 많은 2D 배열이 있습니다. 해당 데이터 세트가없는 a의 값의 경우 timeData(:,:,a)의 내용은 {0x0 double}의 nx1 배열입니다.

후속 코드에서 timeData의 내용을 반복해야하며, {0x0 double}을 어떻게 든 할인하지 않고 timeData(:,:,a)에있는 데이터 세트의 크기를 찾을 수 있어야합니다.

이 문제를 해결하기 위해 할당 문을 어떻게 수정할 수 있습니까?

편집

: 위 예 원하는 출력은 N과 다음된다 = 5.이 데이터 세트는 이제 가능성 이전 또는 후속하는 것을 고려 A = 9

timeData(:,:,9) = {[1.1]} 
        {[2.3]} 
        {[5.5]} 
        {[8.6]} 
        {[4.4]} 

표현 될하자 A 행렬의 값은 n = 7로 설정된 data을 가지며 n = 7은 최대 값이 data (가장 큰 n 값)입니다. 그래서 내 코드에서 같은 timeData(:,:,9) 출력 :

timeData(:,:,9) = {[1.1]} 
        {[2.3]} 
        {[5.5]} 
        {[8.6]} 
        {[4.4]} 
        {[0x0 double]} 
        {[0x0 double]} 
데브 위원장 @

, 내가 그것을 이해, 당신의 대답은 나에게 그들 (의 {[0x0 double]}이 세포를 제거 할 수있는 기능을 제공합니다이게 내가 "할인"는 무엇을 의미하는 것입니다). 이것은 좋은 계획 B이지만, 처음에 {[0x0 double]} 세포가 나타나지 않도록하는 방법이 있습니까?

편집 2 : 위의 문장에 대한 업데이트 "귀하의 대답을 통해 {[0x0 double]}이있는 셀을 삭제할 수 있습니다 (이것은"할인 "이라는 의미입니다)." cellfun(@isempty...) 함수는 {[0x0 double]} 셀을 {[0x0 cell]}으로 이동 시키지만 제거하지는 않습니다. 즉, size(timeData(:,:,9))은 명령이 수행되기 전후에 동일합니다. 이것은 내가 원하는 것이 아닙니다. 나는 size(timeData(:,:,9))이 a의 다른 값에 상관없이 5x1이 되길 원합니다.

편집 3 :

timeData(:,:,9) = {[1.1;2.3;5.5;8.6;4.4]} % An n x 1 column matrix within 
              % the cell. 

하지만이 결과 또는 상기 한 바와 같은 결과로 작업 할 수 있습니다 : 난 그냥 가장 원하는 출력은 다음이 될 것이라고 깨달았다.

+0

어떻게 든 "{0x0 double}"_을 (를) 모두 할인하지 않아도됩니다. 셀 배열에 빈'double' 배열 대신 빈 셀을 갖기를 원합니 까? 질문에서 제공 한 예제에 대한 예상 결과 ('timeData' 또는 후속 요소 수)를 지정하십시오. 과제를 그대로 유지하고 나중에 비어 있지 않은 데이터를 지능적으로 계산할 수 있다고 생각합니다. –

답변

0

불행히도 데이터 세트의 구조를 이해하지 못하기 때문에 더 나은 할당 방법을 제안 할 수 없습니다.

cellfun(@isempty,timeData); 

무엇 위의하는 일은 의미하는 logical 배열을 timeData의 크기를 돌려 주어 세포는 뭔가를 포함한다 : 그러나, 나는 그것이 생성 된 것 후에 당신은 당신의 데이터를 처리 할 수 ​​있습니다 작업을 지적하고 싶습니다 "빈". 일반적으로 임의의 데이터 유형의 배열은 0과 같은 하나 이상의 차원이있는 경우 "비어있는"것으로 간주됩니다.

어떻게 활용할 수 있습니까?

%% Example 1: counting non-empty cells: 
nData = sum(~cellfun(@isempty,timeData(:))); 

%% Example 2: assigning empty cells in place of empty double arrays: 
timeData(cellfun(@isempty,timeData)) = {{}}; 
관련 문제