对包含不同大小字符串的单元格数组使用“xlswrite”MATLAB

时间:2012-12-09 03:58:30

标签: arrays matlab

当我尝试将xlswrite用于每个元素中具有不同长度字符串的单元阵列4X10左右时,MATLAB返回了此错误:

Error using xlswrite (line 188)
An error occurred on data export in CSV format.

Caused by:
    Error using dlmwrite (line 118)
    The input cell array cannot be converted to a matrix.

我把它归结为“dlmwrite”函数中由“xlswrite”调用的某个地方,它调用“cell2mat”,它将我的单元数组的元素连接到一个字符数组。但是,它会垂直和水平地连接元素,如果它们的长度不同,则不可能垂直连接字符元素。您最终会得到一个不一致维度的数组。例如,

如果我有'abcdef'和'abc',将它们垂直连接会给出:

ABCDEF

ABC

第一行的长度为6,第二行的长度为3,如果您正在讨论矩阵,则在逻辑上没有意义,在这种情况下应该是2X6。

有人知道解决方法吗?我对MATLAB中的这个故障感到非常沮丧。

1 个答案:

答案 0 :(得分:2)

我没有收到你的错误 - 至少我的输入版本。你的'a'中有一个错误,但我想这只是在评论中,而不是在你的实际代码中。

也许错误得到修复?我正在使用2012a。

反正;您可以使用建议的解决方法。它只是一行代码。

% here are your data
a = {'$','gsqtmpiv','lsso';...
    'gsqqmwwmsr','efwxvegxmsr','gpsgo';...
    'hexyq','tst','vyffiv';...
    'pek','geqive','xerkmivw';...
    'tvigsppyhih','fewmexih','vywxmge'};

% this works fine in 2012a
xlswrite('blah.xls',b)

% but using dlmwrite directly fails
% like you described
try
    dlmwrite('test.txt', a)
catch ME
    disp(ME.message)
end

% so instead use the suggested work-around:
b = cellfun(@(s) sprintf('%-12s', s), a, 'UniformOutput', false);
% and dlmwrite will no longer fail
dlmwrite('test.txt', b)

您需要知道字符串的最大长度(在testdata中为11)并在格式化字符串中使用

'%12s' 

最大长度为12。

问题在于,如果将它与xlswrite一起使用,则字符串中将包含空格。如果您使用

,它们是不可见的
'%-12s' 

格式化,所以除非你使用字符串进行进一步处理,否则它可能没问题?