あなたはとても近くです。私は出力が数値配列ではなくセル配列になるように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行列である。
代表的なデータセットと希望する出力を提供してください。達成しようとしていることはわかりません。彼らが処理されているときにこれらを印刷しているとすれば、なぜあなたは 'repmat'を必要としますか? – excaza
質問を投稿した後、私はそれがどのように混乱するかを見ることができます。私は私の質問を編集します。 – jenszvs
構造体を作成するコマンドであるので、 'struct'と呼ぶことはできません。 – Finn