2017-05-19 2 views
3

별표 ('*')가 포함 된 문자 배열을 숫자 형으로 변환하려고 애 쓰고 있습니다.별표를 포함하는 문자 배열을 MATLAB의 숫자로 변환

.dat 파일에서 가져온 데이터를 기반으로하는 문자 벡터의 셀 배열이 있습니다. 예를 들어, 셀 어레이 C 세포 (예를 들어, C{1,1}, C{2,1}, ... C{n,1}), 각 문자 벡터를 포함하는의 예는, C{1,1}에 포함 된 열을 포함

'23.000   *   *  1.000  1.000  1.000  34.000  5.065  6.719' 

내가 숫자를 두 번, MATLAB에 C{1,1}을 변환하려고

new_double = str2num(C{1,1}) 

new_double = 

    23.0000 1.0000 1.0000 1.0000 34.0000 5.0650 6.7190 
,536,913을 : 내가 수동으로 별표를 제거하면 코드가 작동

new_double = str2num(C{1,1}) 

new_double = 

    [] 

빈 배, 예를 반환

내가하고 싶은 것은 추가 처리를 위해 데이터를 이중 배열로 읽는 것뿐입니다. 명령이 별표를 무시하거나 NaN으로 바꾼다면 상관하지 않습니다. 별표가있는 데이터는 중요하지 않습니다. 중요한 것은 마지막 두 열 (예 : 5.065 6.71)의 데이터를 읽는 것입니다. 불행히도 문자 벡터 안에 포함되어 있으므로 색인을 생성 할 수 없습니다. , https://uk.mathworks.com/matlabcentral/answers/127847-how-to-read-csv-file-with-asterix 그러나 : 유일하게 유용한 게시물의 존재,

c2 = C{1,1}; 
new_double = sscanf(c2,'%f%'); 

을하지만 별표에서 읽기 중지, 예를 들어,

new_double = 

    23 

내가 지금까지 검색 한 넓은 :

또한 사용하여 시도했다 구분 된 데이터가 아닌 문자 벡터에서 작업하기 때문에이 메서드를 사용할 수 없습니다.

답변

3

는 여기에 또 다른 방법 :

C{1,1} = '23.000   *   *  1.000  1.000  1.000  34.000  5.065  6.719'; 
result = str2double(strsplit(C{1})); 

이 다음과 같이 작동

result = 
    23.0000  NaN  NaN 1.0000 1.0000 1.0000 34.0000 5.0650 6.7190 

을 제공합니다

  1. strsplit 공백에서 문자열을 분할합니다. 인접한 공백이 아닌 문자로 구성된 하위 문자열의 셀 배열을 제공합니다.
  2. str2double은 각각의 셀을 숫자로 변환하고 숫자로 해석 할 수없는 항목에 NaN 인 숫자 벡터를 결과로 제공합니다.

str2num 이상 str2double를 사용의 장점은 전자는 내부적으로하지 않습니다 eval를 사용하는 것이, 그래서 그것은 잠재적으로 위험한 코드를 실행할 수 없습니다.

+0

영리합니다. 물론 정규식 접근 방식보다 우수합니다. 나는'str2double'이 그렇게 할 수 있을지 몰랐다. – rayryeng

+0

@rayryeng 감사합니다! 정규식을 사용하는 것도 좋은 접근 방법입니다 –

+0

유익하고 신속한 응답을 해주셔서 감사합니다. 나는 둘 다에서 제비를 배웠다. 'strsplit'에 대한 말을 퍼뜨릴 시간 !! – PyjamaNinja

2

둘 다 해보 죠. 별표를 무시하려는 첫 번째 경우에는 문자열에서 해당 별표를 제거하고 평소대로 str2num을 수행 할 수 있습니다. 데이터를 정의 :

:

C{1,1} = '23.000   *   *  1.000  1.000  1.000  34.000  5.065  6.719'; 

... 당신은 잠재적으로 (같은 당신이 **, *** 등을 한 경우) regexprep과 빈 문자열로 변경 순서에있는 여러 별표를 제거하려면 regular expressions을 사용할 수 있습니다 이 말씀을

out = regexprep(C, '*+', ''); 

는 셀 어레이 C의 모든 문자열을, 우리는 빈 문자열로 *의 기존 순서를 교체하는 것이 있습니다. 이 경우

, 우리가 얻을 :

>> out = regexprep(C, '*+', '') 

out = 

    cell 

    '23.000       1.000  1.000  1.000  34.000  5.065  6.719' 

당신은 가서 따라 str2num를 호출 할 수 있습니다.

out = regexprep(C, '*+', 'NaN'); 

우리가 얻을 :

>> out = regexprep(C, '*+', 'NaN'); 

out = 

    cell 

    '23.000   NaN   NaN  1.000  1.000  1.000  34.000  5.065  6.719' 

포인트는 영향을받는 부품을 교체하는 것입니다 당신은, 예를 들어 NaN에 별표를 대체 단지 빈 문자열 대신 NaN를 다시 regexprep를 사용하지만 지정하기로 결정해야 당신의 문자열에서 뭔가 다른 것으로, regexprep가 확실히 도움이 될 수 있습니다.

관련 문제