2014-02-17 3 views
0

Matlab에서 셀 배열의 숫자 표현을 double 배열로 숫자 표현으로 변환하는 작업은 str2double 또는 str2numcellfun의 조합으로 수행 할 수 있습니다. A recent poststr2matsscanf의 조합을 사용하여 더 빠른 변환을 달성하도록 제안했습니다. 그러나,이 방법은 다음과 같은 특정 데이터 세트에 대해 실패 할 것 같다sscanf로 데이터를 부정확하게 읽음

x={'98.78743';'99.39717';'99.93578';'100.40125';'100.79166';'101.10525';'101.34037';'101.49553';'101.56939';'101.56072';'101.4685';'101.29184';'101.03002';'100.68249';'100.24887';'99.72897';'99.12274';'98.43036';'97.65215';'96.78864';'95.84054'}; 
y=sscanf(str2mat(x).','%f'); 
[str2double(x),y,str2double(x)-y] 
ans = 

    98.7874 98.7874   0 
    99.3972 99.3972   0 
    99.9358 99.9358   0 
    100.4013 100.4013 -0.0000 
    100.7917 0.7917 100.0000 
    101.1052 0.1053 101.0000 
    101.3404 0.3404 101.0000 
    101.4955 0.4955 101.0000 
    101.5694 0.5694 101.0000 
    101.5607 0.5607 101.0000 
    101.4685 0.4685 101.0000 
    101.2918 101.2918 -0.0000 
    101.0300 0.0300 101.0000 
    100.6825 0.6825 100.0000 
    100.2489 0.2489 100.0000 
    99.7290 0.7290 99.0000 
    99.1227 99.1227   0 
    98.4304 98.4304   0 
    97.6522 97.6522   0 
    96.7886 96.7886   0 
    95.8405 95.8405   0 

상기 코드 블록의 마지막 행은 원래 셀 어레이의 이중 나타내는 도면 상기 sscanf γ 변환 형태 및 둘 사이의 차이. 충실한 변환을 위해서는 세 번째 열의 모든 항목이 정확하게 0 일 것입니다. 값의 대부분은 부적절한 최상위 자릿수의 제거로 변환됩니다. 이 잘못된 행동의 근거는 무엇이며 정확한 진술을하기 위해 진술을 약간 수정할 수 있습니까? 일반적으로 변환하려는 숫자는 길이가 다르며 (소수점 이전 및 이후) ​​길이가 같은 셀 배열의 모든 숫자에 의존하는 모든 방법이 실패하게됩니다. 마지막으로, MATLAB의 내 버전은 2013 년 이전이므로 위 게시물에서 제안 된 strjoin 접근 방식에 의존 할 수 없습니다.

답변

1

대신을 시도해보십시오

y=sscanf(str2mat(x).','%9f') 

9 실제로 sscanf 9 개 수레를 검색하고 공간을 발견 한 경우 중지됩니다, 따라서 str2mat(x).'

>> str2mat(x).' 

ans = 

999111111111111999999 
899000000000000998765 
...001111111100...... 
739............714678 
893471345542062223584 
775090496669384820280 
417115059081028973165 
378262353758048746544 
    5657392 4297  

의 숫자의 최대 길이에 해당합니다. 데이터에 따라 9 가지 값을 정의 할 수 있습니다.

예 :

x={'98.7';'99.397';'99.93578';'100.4';'100.79166';'101.10'}; 
>> str2mat(x).' 

ans = 

999111 
899000 
...001 
739... 
93471 
75 90 
    7 1 
    8 6 
    6 

여기에 최대 길이는 여전히 9입니다 그리고 대답은 여전히 ​​올바른 것입니다. %'number'f에 대한 임의의 길이를 결정하는

y=sscanf(str2mat(x).','%9f') 

>> y = 

    98.7000 
    99.3970 
    99.9358 
    100.4000 
    100.7917 
    101.1000 

는 사용

size(str2mat(x).',1) 

그리고 또 다른 트릭 :

위해
xMaxLength = num2str(size(str2mat(x).',1)); 
y = sscanf(str2mat(x).',['%' xMaxLength 'f']); 

으로 만 계산 str2mat 한 시간 :

xx = str2mat(x).'; 
xxMaxLength = num2str(size(xx,1)); 
y = sscanf(xx,['%' xxMaxLength 'f']); 
+0

않습니다 9는 단일 열 (8)에있는 최대 문자 수와 패딩, 간격 또는 줄 바꿈 중 하나의 문자로 구성됩니까? 단일 숫자 (+1)의 최대 길이가 선택되는 한이 전략은 일반적으로 다양한 길이의 숫자 세트 (십진수 이전 및 이후)에 대해 작동합니까? – user001

+0

@ user001 몇 가지 설명을 추가했습니다. MATLAB의'sscanf' 문서에서 % numbers가 무엇인지 알 수 있습니다. –

+0

둘째, 길이가 선험적으로 알려지지 않은 경우 (즉, '9'값을 간단한 표현식에서 변수로 결정할 수 있는지) 데이터 집합에서 가장 긴 길이를 결정하는 간단한 방법이 있습니까? 다시 한번 감사드립니다. – user001

관련 문제