2013-03-21 129 views
0

再次您好逻辑朋友! 我知道这是一个相当复杂的问题,所以请耐心等待!我想我已经设法把它归结为两个细节: - 我需要两个我似乎无法工作的循环... 首先;可变滚筒(1).ink是包含墨水值的(12x1)矢量。这个程序在每个连接处的滚筒之间均匀地共享墨水。我试图让滚筒(1).ink只在特定的时间步长与滚筒(2)相互作用。墨水应每转一圈转入系统一次,即nTimesSteps = nBins_max的每个倍数。当系统旋转时,墨水不应该转移回滚筒(1).ink。每转只能将墨水引入系统一次,并且不能退出。目前我已经设置了滚筒(1).ink = 1,但仅用于测试。我真的被困在这里!其次;它需要这样做的原因是因为在SIM卡的最后我还希望以打印图像的形式去除墨水。图像应该是我系统中最后一个滚筒上的墨水的反射,这个值的一半应该从最后一个滚筒上去除,并在每次旋转时从系统中取出。留在最后一个滚筒上的墨水应该循环使用,并在系统中“重新分开”以备下一次旋转。 所以......我认为这是围绕循环开始line86,我需要做所有这些东西。在伪,对于间歇进料我一直是这样的: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不是一个Matlab的关键字,并为你写它由返回的值语句不从次迭代),相当于改变

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)处有一个滚轮连接的位置,其他位置有一个0。你可以找到所有的1 S的行和列索引是这样的:

[ri,ci] = find(conn==1) 

然后,您可以拿起1 S的(row,col)位置没有循环的巢并且如果开始

for ii = 1:N 
    for jj = 1:N 
     if(ii~=jj) 
      if(conn(ii,jj) == 1) 
声明

我可以继续,但不会,这就足够一个评论。

+0

感谢您的建议。我知道(:)操作符,实际上我试图按照您在这里建议的形式使用它,但没有成功(可能在以前的文章中)。我认为它只会达到我想要做的一半,即 - 如果不引入墨水,我需要某种方式让系统忽略此滚筒。我感谢您的兴趣和您提出的建议,特别是简单'find',我会花费时间对代码进行流式处理。我已经按照建议编辑了这个问题 - 希望在树上创建一个小的空地!谢谢 – richyo1000 2013-03-22 08:46:29