2016-08-17 66 views
0

我想使用fprintf在命令窗口中顯示代碼執行進度。命令窗口中的打印進度

我有N x 1結構數組,我們稱之爲myStructure。每個元素都有字段namedata。我想與數據點的數量打印name並排,像這樣:

name1 number1 
name2 number2 
name3 number3 
name4 number4 
... 

我可以使用repmatÑfprintf沿。問題在於所有數字都必須在單元陣列中的名稱之間出現C

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

我可以使用cellfun來獲取數據點的名稱和數量。

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

但是我不知道如何與交替的元素得到這個成單元陣列C使fprintf工作。

有沒有辦法做到這一點?有沒有更好的方式讓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{:}); 

與代碼的第三行的訣竅是,當你解開使用{:}單元陣列,這在列重大格式展開逗號分隔的列表,這樣做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的一個矩陣。

+0

啊,當然,輸出到'A {:}'也會把剩餘的行做到我想要的!另外,請原諒我可怕的命名選擇,這只是一個簡單的想法,因爲沒有任何變量名稱來自我的原始代碼,所以我只是很快寫了一些東西。如果你可以在你的答案中編輯它,那將非常值得讚賞,因爲我很尷尬。當然,留下它讓我想起了恥辱,所以也許這也是一個很好的提醒:) – jenszvs

+0

@Jens我很樂意順從:)讓我現在編輯它。沒有什麼好尷尬的。一點也不。我向你保證,幾乎每一個MATLAB程序員都在無意間執行了這種陰影......在他們的一生中至少有一次。我剛剛學會確保我永遠不會這樣做,因爲這肯定讓我在@ $$之前就有了。 – rayryeng