在MATLAB中,如果我有一个字符串:
a='0.424870551E+03-0.100113019E+03 0.470220758E+03';
如果我使用
b=str2num(a);
我得到了
b =324.7575 470.2208;
也就是说,MATLAB对前两个数字执行了操作,而不是给出一个3列向量。
是否有可能在不使用textscan
的情况下将a转换为3列矢量?
这可能看起来很简单;我在str2num
文档中没有找到任何进一步的信息,这就是我要问的原因,
答案 0 :(得分:3)
正确指定格式,即使没有空格也会正确解释:
>> sscanf(a,'%E')
ans =
424.8706
-100.1130
470.2208
答案 1 :(得分:2)
你需要在每个减号之前引入一个空格,除非减号在指数中(感谢Rafael Monteiro注意到这一点)。这样Matlab知道它们是不同的数字:
a = '0.424870551E+03-0.100113019E+03 0.470220758E+03';
ind = a=='-'; %// detect positions of "-" ...
ind2 = [0 a(1:end-1)=='E'];
ind = ind & ~ind2; %// ... but not in exponents. Thanks to Rafael Monteiro
asep = repmat(' ',1,numel(a)+nnz(ind)); %// initiallize with spaces
asep((1:numel(a))+cumsum(ind)) = a; %// fill in a. Leave a blank before each "-"
b = str2num(asep);
这给出了:
a =
0.424870551E+03-0.100113019E+03 0.470220758E+03
asep =
0.424870551E+03 -0.100113019E+03 0.470220758E+03
b =
424.8706 -100.1130 470.2208
答案 2 :(得分:1)
问题是第一个和第二个数字之间没有空格。然后,函数认为你想减去它们。
有四种方法可以做到。
对于前三个,这就是你得到的:
str2num('0.424870551E+03-0.100113019E+03 0.470220758E+03')
str2num('0.424870551E+03 - 0.100113019E+03 0.470220758E+03')
str2num('0.424870551E+03- 0.100113019E+03 0.470220758E+03')
ans =
324.7575 470.2208
但是这样做会让你分别想要这三个数字:
str2num('0.424870551E+03 -0.100113019E+03 0.470220758E+03')
ans =
424.8706 -100.1130 470.2208