MATLAB文件创建时字符串拼接结果差异原因咨询
为什么MATLAB里三种字符串拼接方式结果差异这么大?
咱们一步一步拆解你遇到的问题,核心在于MATLAB对char数组和string数组的处理逻辑完全不同,这是新手很容易踩的坑:
1. 第一种方法:[basefilename num2str(1) ".mat"]
你得到的是1×3的string数组,而课程里是拼接好的testfile1.mat,问题出在basefilename的类型上:
- 课程里的
basefilename = 'testfile'是char数组(用单引号定义),MATLAB中对char数组用方括号[]是直接拼接字符,把三个char数组连成长char,最后得到'testfile1.mat'。 - 而你定义的
basefilename = "testfile"是string数组(双引号),方括号对string数组的作用是水平串联数组元素,相当于把三个独立的string("testfile"、num2str(1)转成的string、".mat")拼成一个string数组,而不是拼接成单个字符串。
2. 第二种方法:[basefilename + "1" + ".mat"]
这里的+是MATLAB专门给string类型设计的字符串拼接运算符,不管你用双引号的string还是把char转成string,只要用+就能把它们拼接成单个string,所以这个方法能得到正确结果。
3. 第三种方法:[basefilename + num2str(1) + ".mat"]
这是最容易踩的坑!num2str(1)返回的是char数组('1'),当你用+把string和char数组相加时,MATLAB不会把char当成字符串来拼接,而是会把char数组里每个字符的ASCII码值和string里每个字符的ASCII码值对应相加,然后再转成string。
比如:
"testfile"里的第一个字符t的ASCII是116,'1'的ASCII是49,相加得到165,对应一个特殊字符;- 第二个字符
e是101,加49得到150,又是另一个特殊字符;
以此类推,最后再加上".mat"的ASCII值,就得到了你看到的那些奇怪的"165.mat"之类的结果。
给你的解决建议
如果要在for循环里用变量拼接文件名,推荐两种靠谱的方式:
- 方式一:统一用char数组,保持和课程一致的写法:
basefilename = 'testfile'; for i = 1:5 filename = [basefilename num2str(i) '.mat']; % 后续操作 end - 方式二:统一用string类型,结合
string()把数字转成string,用+拼接:basefilename = "testfile"; for i = 1:5 filename = basefilename + string(i) + ".mat"; % 后续操作 end - 更简洁的方式:用
sprintf(不管char还是string都适用):basefilename = "testfile"; % 或者' testfile' for i = 1:5 filename = sprintf("%s%d.mat", basefilename, i); % 如果是string类型,最后可以转成string:filename = string(sprintf(...)); end
内容的提问来源于stack exchange,提问作者A. Rapoport
相关产品推荐
相关产品推荐

