2013-03-21 2 views
0

안녕하세요, 다시 논리적 인 친구! 이것이 상당히 관련된 질문이므로 제발 저를 참아주십시오! 나는 두 가지 특성을 이해할 수 있었다고 생각한다. - 나는 두 개의 루프가 필요하다. 나는 작동하지 않는 것처럼 보인다 ... 첫째로; 가변 롤러 (1) .ink는 잉크 값을 포함하는 (12x1) 벡터입니다. 이 프로그램은 각 연결부에서 롤러 사이의 잉크를 동일하게 공유합니다. 나는 특정 타임 스텝에서만 롤러 (2)와 상호 작용하는 롤러 (1)를 얻으려고 시도하고있다. 잉크는 매 회전마다 한번, 즉 nTimesSteps = nBins_max의 각 배수로 한번 전달되어야한다. 잉크는 시스템이 회전 할 때 롤러 (1) .inch로 다시 전달되어서는 안됩니다. 회전 당 1 회만 시스템에 잉크를 주입해야하며 뒤쪽을 꺼내지 않아야합니다. 현재 나는 roller (1) .ink = ones하지만 테스트 용으로 만 설정했습니다. 나는 정말로 여기에서 붙이게된다! 둘째로; 그 이유는 시뮬레이션이 끝나면 인쇄 된 이미지의 형태로 잉크를 제거하기를 원하기 때문입니다. 이미지는 내 시스템의 마지막 롤러에있는 잉크의 반사가되어야하며이 값의 절반은 마지막 롤러에서 제거되어야하며 각 회전마다 시스템에서 꺼내야합니다. 마지막 롤러에 남아있는 잉크는 다음 회전을 위해 시스템에서 재활용 및 '재분할'되어야합니다. 그래서 ... 나는이 모든 것들을 할 필요가있는 루프 시작 라인 86 주위에 있다고 생각합니다. 다만,matlab에 간헐적 인 루프

For k = 1:nTimeSteps 
While nTimesSteps = mod(nTimeSteps, nBins_max) == 0 % This should only output when nTimeSteps is a whole multiple of nBins_max i.e. one full revolution 
‘Give me the ink on each segment at each time step in a matrix’ 
End 

averageAmountOfInk에 대한 출력은 내가 정말 평균이 필요하지 않습니다를 제외하고이 데이터를 반환하고자하는 정확한 형식은 다음과 같습니다 의사에서 간헐적에 대한에 공급 내가 좋아하는 뭔가를하려고했는데 각 순간의 실제 가치 누군가가 현재 무엇을보고 관심이 있다면 아래의 전체 코드를 게시합니다

For m = 1:nTimeSteps 
    For n = 1:N 
Rollers(m,n) = rollers(n).ink’; 
    End 
End 

: 내가 좋아하는이 사용하여 뭔가를 다시 만들려고 할 때 나는 차원 불일치 점점 오류를 유지한다. 마지막에는 별도의 파일로 저장해야하는 기능이 있습니다. 몇 가지 질문을 여러 번 게시했지만 상당히 까다로운 문제임을 잘 알고 있으며 인터넷을 통해 내 의도를 파악하기가 어렵습니다. 프로그래밍 기술이 부족하다는 것에 대해 누구나 아이디어/조언/일반적인 모욕이 있다면 답장을 보내 주시기 바랍니다!

%% Simple roller train 
% # Single forme roller 
% # Ink film thickness = 1 micron 

clc 
clear all 
clf 
% # Initial state 
C = [0,70; % # Roller centres (x, y) 
    10,70; 
    21,61; 
    11,48; 
    21,34; 
    27,16; 
    0,0 
    ]; 
R = [5.6,4.42,9.8,6.65,10.59,8.4,23]; % # Roller radii (r) 
% # Direction of rotation (clockwise = -1, anticlockwise = 1) 
rotDir = [1,-1,1,-1,1,-1,1]'; 
N = numel(R);   % # Amount of rollers 

% # Find connected rollers 
isconn = @(m, n)(sum(([1, -1] * C([m, n], :)).^2)... 
    -sum(R([m, n])).^2 < eps); 
[Y, X] = meshgrid(1:N, 1:N); 
conn = reshape(arrayfun(isconn, X(:), Y(:)), N, N) - eye(N); 

% # Number of bins for biggest roller 
nBins_max = 50; 
nBins = round(nBins_max*R/max(R))'; 

% # Initialize roller struct 
rollers = struct('position',{}','ink',{}','connections',{}',... 
    'rotDirection',{}'); 

% # Initialise matrices for roller properties 
for ii = 1:N 
    rollers(ii).ink = zeros(1,nBins(ii)); 
    rollers(ii).rotDirection = rotDir(ii); 
    rollers(ii).connections = zeros(1,nBins(ii)); 
    rollers(ii).position = 1:nBins(ii); 
end 

for ii = 1:N 
    for jj = 1:N 
     if(ii~=jj) 
      if(conn(ii,jj) == 1) 
       connInd = getConnectionIndex(C,ii,jj,nBins(ii)); 
       rollers(ii).connections(connInd) = jj; 
      end 
     end 
    end 
end 

% # Initialize averageAmountOfInk and calculate initial distribution 
nTimeSteps = 1*nBins_max; 
averageAmountOfInk = zeros(nTimeSteps,N); 
inkPerSeg = zeros(nTimeSteps,N); 
for ii = 1:N 
    averageAmountOfInk(1,ii) = mean(rollers(ii).ink); 
end 

% # Iterate through timesteps 
for tt = 1:nTimeSteps 
     rollers(1).ink = ones(1,nBins(1)); 

     % # Rotate all rollers 
    for ii = 1:N 
       rollers(ii).ink(:) = ... 
       circshift(rollers(ii).ink(:),rollers(ii).rotDirection); 
    end 

% # Update all roller-connections 
for ii = 1:N 
    for jj = 1:nBins(ii) 
     if(rollers(ii).connections(jj) ~= 0) 
      index1 = rollers(ii).connections(jj); 
      index2 = find(ii == rollers(index1).connections); 
      ink1 = rollers(ii).ink(jj); 
      ink2 = rollers(index1).ink(index2); 
      rollers(ii).ink(jj) = (ink1+ink2)/2; 
      rollers(index1).ink(index2) = (ink1+ink2)/2; 
     end 
    end 
end 

% # Calculate average amount of ink on each roller 
    for ii = 1:N 
     averageAmountOfInk(tt,ii) = sum(rollers(ii).ink); 
    end 
end 

    image(5:20) = (rollers(7).ink(5:20))./2; 
    inkPerSeg1 = [rollers(1).ink]'; 
    inkPerSeg2 = [rollers(2).ink]'; 
    inkPerSeg3 = [rollers(3).ink]'; 
    inkPerSeg4 = [rollers(4).ink]'; 
    inkPerSeg5 = [rollers(5).ink]'; 
    inkPerSeg6 = [rollers(6).ink]'; 
    inkPerSeg7 = [rollers(7).ink]'; 

답변

1

이 확장 된 의견이 아니라 적절한 대답이지만, 주석 상자가 조금 너무 작 ...

귀하의 코드가 저를 압도, 나는 나무의 나무를 볼 수 없습니다. 직접 문제를 해결하는 데 도움이되는 모든 것을 제거하는 것이 좋습니다. (예 : 모든 선이 그림을 그립니다.) 코드를 직접 디버깅하여 모든 것을 처리하는 데 도움이 될 것이라고 생각합니다. 기능 또는 스크립트.

귀하의 코드

For k = 1:nTimeSteps 
    While nTimesSteps = mod(nTimeSteps, nBins_max) == 0 
    ‘Give me the ink on each segment at each time step in a matrix’ 
End 

는 단어 While는 매트랩 키워드 아니며, (나는 꽤 while 문장의 사용을 이해하지 수 있습니다 당신은 그것에게 반환 된 값을 작성한로 명령문이 반복에서 반복으로 바뀌지 않음)

For k = 1:nBins_max:nTimeSteps 
    ‘Give me the ink on each segment at each time step in a matrix’ 
End 

Matlab의 콜론 연산자의 필수 기능을 놓친 것처럼 보입니다.

1:8 = [1 2 3 4 5 6 7 8] 

하지만

이다
1:2:8 = [1 3 5 7] 

은 삼중의 두 번째 번호는 연속 소자 사이의 스트라이드이다.

행렬 conn에는 롤러가 연결된 (row,col)에 1이 있고 다른 곳에 0이 있습니다. 이 같은 모든 1의의 행과 열 인덱스를 찾을 수 있습니다

[ri,ci] = find(conn==1) 
그런 다음 루프의 둥지없이

for ii = 1:N 
    for jj = 1:N 
     if(ii~=jj) 
      if(conn(ii,jj) == 1) 
을 시작 제표 경우 1의의 (row,col) 위치를 선택할 수

나는 계속할 수 있지만, 한 마디에 충분하다.

+0

제안 해 주셔서 감사합니다. 나는 실제로 (:) 이전 연산자에서 성공하지 않고 여기에 제안한 양식에서 그것을 사용하려고 사실 (:) 연산자 알고있다. 나는 그것이하려고하는 것의 절반 만 달성 할 것이라고 생각합니다. 즉, 잉크를 사용하지 않으면 시스템이이 롤러를 무시할 수있는 방법이 필요합니다. 귀하의 관심과 제안, 특히 단순함에 감사드립니다. '찾기'는 코드가 작동하면 코드를 스트림 라이닝하는 데 시간을 보냅니다. 제안 된대로 질문을 편집했습니다. 나무에 작은 개간을하기를 바랍니다! 감사합니다. – richyo1000