字符串是一个元胞数组
好吧,不是真的.. 这是一个矩阵,但继续阅读。
我猜单元格数组是 MATLAB 中最神秘的数据类型。所以让我们稍微揭开它的神秘面纱;-)
认为
fruits = {...
'banana',...
'apple',...
'orange'...
}
首先,小型数组不需要整数索引。使用类似 foreach的结构要好得多。的确,
for index = 1:numel(fruits)
fruits{index}
end
相当于
for fruit = fruits
fruit
end
正确的?
嗯,不完全是。第一个循环产生字符串,而第二个循环产生单元格。你可以检查它
for index = 1:numel(fruits)
[isstr(fruits{index}) iscell(fruits{index})]
end
for fruit = fruits
[isstr(fruit) iscell(fruit)]
end
,即[1 0]和[0 1]。
如果您发现了差异,那么您必须知道如何处理下一个示例(在这个示例中确实与您的问题有关(!)我保证!)。假设您尝试在循环中进行水平连接:
for fruit = fruits
[fruit 'is a fruit']
end
你会得到
ans =
'banana' 'is a fruit'
等等。为什么?显然,此代码尝试将嵌套单元格数组连接到字符串(包含字符矩阵的单元格数组,这些字符构成字符串,如“香蕉”)。所以,正确答案是
利用 {:}
for fruit = fruits
[fruit{:} 'is a fruit']
end
神奇的是,这已经产生了预期的“香蕉是水果”、“苹果是水果”等。
提示
一些提示:
- 无索引循环与结构很好地配合,如
for fruit = [fieldnames][1](fruits)'
- 以上对于开源八度都是正确的
- 香蕉不仅是水果,在分类学上它也是一种草本植物 ;-) 就像 MATLAB 中的 'banana' 既是字符串又是矩阵,即 assert(isstr('banana') && ismat('banana')) 通过,但是断言(iscell('banana'))失败。
{:}
相当于cell2mat
附言
您的问题的解决方案可能如下所示:
给定
vcell = {...
'v' 576.5818 3.0286 576.9270;
'v' 576.5818 3.0286 576.9270
}
将仅按索引的数字类型转换为字符串
vcell(cellfun(@isnumeric, vcell)) = cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false)
以上代码输出
vcell =
'v' '576.58180' '3.02860' '576.92700'
'v' '576.58180' '3.02860' '576.92700'
可以串联。