2016-08-17 5 views
0

fprintf을 사용하여 명령 창에 코드 실행 진행 상태를 표시하고 싶습니다.명령 창에서 인쇄 진행

나는 N x 1 구조체 배열을 가지고 있는데, myStructure이라고 부르기로한다. 각 요소의 필드는 namedata입니다. 나는 그런 것처럼, 데이터 포인트의 수와 측면으로 name면을 인쇄하고 싶습니다 :

name1 number1 
name2 number2 
name3 number3 
name4 number4 
... 

내가 fprintf와 함께 repmatN 시간을 사용할 수 있습니다. 문제는 셀 배열 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{:}); 

코드의 세 번째 라인과 트릭은 {:}을 사용하여 셀 어레이를 풀다 때,이 열 주요 형식 풀려 쉼표로 구분 된 목록을 생성하고, 그래서 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