字符串是一个矩阵
嗯,并不完全是这样,但请继续阅读。
我想在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'
等等。为什么?显然,这段代码试图将嵌套的单元数组连接到字符串上(一个包含由字符矩阵构成的字符串的单元数组,例如 'banana')。因此,正确的答案是
使用 {:}
for fruit = fruits
[fruit{:} 'is a fruit']
end
神奇的是,这已经产生了预期的'香蕉是水果','苹果是水果'等结果。
提示
一些提示:
- 结构体与无需索引循环结合使用非常好,例如
for fruit = [fieldnames][1](fruits)'
- 以上适用于开源的Octave
- 从分类学上讲,香蕉不仅仅是水果,还是草本植物;就像MATLAB中的'banana'既是字符串也是矩阵,即assert(isstr('banana') && ismat('banana'))通过,但assert(iscell('banana'))失败。
{:}
等效于cell2mat
PS
对于你的问题,一个解决方案可能如下:
给定
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'
可以进行连接。
sprintf
被称为hack - 这真是个笑话。 - Yauhen Yakimovich