你非常接近。我會做的是改變你的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{:});
與代碼的第三行的訣竅是,當你解開使用{:}
單元陣列,這在列重大格式展開逗號分隔的列表,這樣做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元素矢量,第二個元素是一個3 x 3 = 9的零矩陣,而最後一個元素是6 x 4 = 24的一個矩陣。
請提供一個有代表性的數據集和所需的輸出,我不知道你要完成什麼。假設你在處理它們時打印這些文件,如果你正在打印進度,你爲什麼需要'repmat'? – excaza
發佈問題後,我可以看到它可能會令人困惑。我會編輯我的問題。 – jenszvs
讓我們不叫它'struct',因爲這是創建結構的命令 – Finn