2016-08-17 23 views
0

fprintfを使用して、コマンドウィンドウでコード実行の進行状況を確認します。コマンドウィンドウでの印刷の進捗状況

私はN x 1構造の配列を持っています。myStructureとしましょう。各要素には、フィールドnamedataがあります。

name1 number1 
name2 number2 
name3 number3 
name4 number4 
... 

Iはfprintfと共にrepmatN回使用することができます。私は、同様に、データ点の数と並んでname側を印刷したいです。問題は、セル配列の名前の間にすべての数字が来ることです。C

fprintf(repmat('%s\t%d',N,1),C{:}) 

cellfunを使用して、データポイントの名前と数を取得できます。

names = {myStucture.name}; 
numpoints = cellfun(@numel,{myStructure.data}); 

私はfprintf仕事をするためにCための要素を交互にセル配列にこれを取得するかどうかはわかりませんが。

これを行う方法はありますか?私が望むようにfprintfを動作させる良い方法はありますか?

+0

代表的なデータセットと希望する出力を提供してください。達成しようとしていることはわかりません。彼らが処理されているときにこれらを印刷しているとすれば、なぜあなたは 'repmat'を必要としますか? – excaza

+0

質問を投稿した後、私はそれがどのように混乱するかを見ることができます。私は私の質問を編集します。 – jenszvs

+1

構造体を作成するコマンドであるので、 'struct'と呼ぶことはできません。 – Finn

答えて

2

あなたはとても近くです。私は出力が数値配列ではなくセル配列になるようにcellfun呼び出しを変更します。 'UniformOutput'フラグを使用し、0またはfalseに設定します。

完了したら、名前のセル配列とサイズのセル配列の両方が重なっている新しいセル配列を作成します。その後、fprintfに一度電話することができます。

% Save the names in a cell array 
A = {myStructure.name}; 

% Save the sizes in another cell array 
B = cellfun(@numel, {myStructure.data}, 'UniformOutput', 0); 

% Create a master cell array where the first row are the names 
% and the second row are the sizes 
out = [A; B]; 

% Print out the elements side-by-side 
fprintf('%s\t%d\n', out{:}); 

コードの3行とのトリックは、あなたが{:}を使用してセル配列をアンロールするとき、これは列優先形式で繰り出さカンマ区切りのリストを作成し、そのout{:}を行うことは、実際にあなたを与えるということです。

A{1}, B{1}, A{2}, B{2}, ..., A{n}, B{n} 

...必要なインターリーブを提供します。したがって、この順序をfprintfに指定すると、指定された書式指定子と一致し、必要なものが得られます。そのため、各列が必要な情報を提供できるようにセル配列をスタックすることが重要です。


マイナー注

もちろんの一つは、あなたの問題に取り組むための最も簡単な方法の一つは、単純なforループを使用することであることを忘れてはいけません。 forループは悪い練習と見なされますが、その性能はMATLABの進化の至るところで大きく進んでいます。簡単に言えば

は、ちょうどこの操作を行います。

for ii = 1 : numel(myStructure) 
    fprintf('%s\t%d\n', myStructure(ii).name, numel(myStructure(ii).data)); 
end 

上記のコードは、我々は、セルアレイと上記やったことに比べて間違いなく、より読みやすいです。fprintfを一度呼び出す目的で中間変数を作成するのではなく、構造に直接アクセスしています。


実行例

ここでは、このランニングの例です。以下に示すデータを使用して:

clear myStructure; 
myStructure(1).name = 'hello'; 
myStructure(1).data = rand(5,1); 
myStructure(2).name = 'hi'; 
myStructure(2).data = zeros(3,3); 
myStructure(3).name = 'huh'; 
myStructure(3).data = ones(6,4); 

私は、印刷コードを実行した後に次のような出力が得られます。

hello 5 
hi 9 
huh 24 

私たちは、構造体の最初の要素は、単にランダムであるようなサイズが正しいことを確認することができます5要素ベクトルであり、第2要素は3×3 = 9ゼロ行列であり、最後の要素は6×4 = 24行列である。

+0

もちろん、 'A {:} 'への出力は、まさに私が望むような残りの行を取ります!また、私の恐ろしい命名選択肢を許してください。それは、変数名のどれも私の元のコードからのものではないので、心のスリップであったので、何かをすぐに書きました。あなたの答えを編集することができれば、それは非常に恥ずかしいので非常に感謝しています。もちろんそれを残して残念私に思い出させるかもしれないので、あまりにも良いリマインダです:) – jenszvs

+0

@Jens私は喜んでいる:)私は今それを編集しましょう。恥ずかしいことは何もありません。どういたしまして。ほぼすべてのMATLABプログラマが、この生き生きとしたことを少なくとも一度は実行していることを保証します。私はちょうど@ $$の前にこれが確実に噛み付いているので、決してそれをしないことを確かめることを学んだ。 – rayryeng

関連する問題