2013-01-08 22 views
6

は、次のことを考えてみましょう:書き込みセルアレイ

DateTime = {'2007-01-01 00:00';'2007-02-01 00:00';'2007-03-01 00:00'}; 
Headers = {'Datetime','Data'}; 
Dat = [100,200,300]; 

Data = [DateTime,num2cell(Dat')]; 
Final = [Headers;Data]; 

私は、タブ区切りのテキストファイルに「決勝」にデータを書き込むだろうか。変数が数値入力のみで構成されているのにfopen、fprintfなどを使用する方法を知っていますが、この問題を解決するためには苦労しています。私は試してみました:

fid = fopen('C:\Documents\test.txt','wt'); 
fprintf(fid,'%s\t%s\n',Final{:}); 
fclose(fid); 

しかし、これはmatlabで生成されたものと同じ形式のテキストファイルを生成しません。どのようにしてこの問題を解決できますか?

+0

+1したコードを簡単に実行できます。 – Acorbe

答えて

6

このソリューションは、私が必要と考えるものを提供します。 N-列のセルの一般的なケースで(コメント)、次のことができます。私は有用であることを願って、いくつかの発言側にある

DateTime = {'2007-01-01 00:00';'2007-02-01 00:00';'2007-03-01 00:00'}; 
Headers = {'Datetime','Data'}; 
Dat = [100,200,300]; 


% // In the way you used fprintf it expects just strings ('%s\t%s\n'), 
% // therefore Data should be composed exclusively by them. 
% // Numbers are converted to strings by using num2str 
% // by using cellfun we iteratively convert every element of num2cell(Dat') 
% // in strings, obtaining a cell 
Data = [DateTime,cellfun(@num2str, num2cell(Dat'), 'UniformOutput' , false)]; 
Final = [Headers;Data]; 

fid = fopen('test.txt','wt'); 

% // this iterates fprintf on the cell rows, giving you the output 
cellfun(@(x,y) fprintf(fid,'%s\t%s\n',x,y),Final(:,1),Final(:,2));  
fclose(fid); 

結果

Datetime Data 
2007-01-01 00:00 100 
2007-02-01 00:00 200 
2007-03-01 00:00 300 

EDIT単純にforループを実行します。

for i = 1 : size(Final,1) 
    fprintf(fid,'%s ', Final{i,:}); 
    fprintf(fid,'\n'); 
end 

(結果は同じですが、列数に依存しません)。

+0

セル配列に2つ以上の列がある場合はどうなるでしょうか。 10列の場合は、ファイナル(:、1)、ファイナル(:2)、ファイナル(:3)などの記述が必要です。個々の列を指定せずにこれが機能する方法が必要ですか? – KatyB

+0

@Kate、確かに。実際にcellfunが行うのは、forループをラップするだけです。この場合、行のためです。あなたができることは、列を含むループのために独自のものを書くことです。私は一般的なケースの答えを変えています。 – Acorbe

+0

@Kate、どうぞご覧ください。 – Acorbe