3

各要素の長さが異なる文字列を含む 4X10 程度のセル配列に対して xlswrite を使用しようとすると、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.

要約すると、「xlswrite」によって呼び出される「dlmwrite」関数のどこかで、セル配列の要素を文字配列に連結する「cell2mat」が呼び出されます。ただし、要素を縦方向と横方向に連結し、縦方向に同じ長さでない文字要素を連結することはできません。一貫性のない次元の配列になってしまいます。例えば、

「abcdef」と「abc」がある場合、それらを垂直に連結すると次のようになります。

abcdef

abc

最初の行の長さは 6 で、2 番目の行の長さは 3 です。行列について話している場合、これは論理的に意味がありません。この場合は 2X6 である必要があります。

誰かがこれに対する回避策を知っていますか? MATLAB のこの不具合にはかなり不満を感じています。

4

1 に答える 1

2

少なくとも私のバージョンの入力では、エラーは発生しません。「a」にエラーがありますが、それはコメントにあるだけで、実際のコードにはないと思います。

エラーが修正されたのではないでしょうか?2012aを使用しています。

ともかく; 提案された回避策を使用できます。これはたった 1 行のコードです。

% 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' 

フォーマットしているので、さらに処理するために文字列を使用しない限り、問題ないでしょうか?

于 2012-12-13T10:28:51.820 に答える