matlab中的间歇循环

时间:2013-03-21 10:21:39

标签: matlab matrix simulation

你好再次逻辑好友! 我知道这是一个非常复杂的问题所以请耐心等待!我想我已经设法将它归结为两个细节: - 我需要两个循环,我似乎无法工作...... 首先;可变辊(1).ink是包含墨水值的(12×1)矢量。该程序在每个连接处的辊子之间均等地共享墨水。我试图让滚轮(1).ink仅在特定的时间步长与滚轮(2)相互作用。对于每一次完整旋转,墨水应该转移到系统中一次,即nTimesSteps = nBins_max的每个倍数。当系统旋转时,墨水不应转移回滚轮(1)上。它应该每次旋转只向系统引入一次墨水而不会退回。目前我已经设置了滚轮(1).ink =仅用于测试。我真的被困在这里了! 其次;它需要这样做的原因是因为在sim结束时我还希望以打印图像的形式去除墨水。图像应该是我系统中最后一个滚筒上的墨水的反射,这个值的一半应该从最后一个滚筒上移除,并在每次旋转时从系统中取出。留在最后一个滚筒上的油墨应该回收并在系统中“重新拆分”,以备下次旋转。 所以...我认为这是围绕循环开始的第8行,我需要做所有这些事情。在伪,对于间歇性的进给,我一直在尝试类似的东西:

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 个答案:

答案 0 :(得分: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关键字,并且你已经写了它,语句返回的值不是' t从迭代变为迭代)等效于

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)

然后,您可以在没有循环嵌套的情况下获取(row,col)的{​​{1}}个位置,并且if语句可以开始

1

我可以继续,但不会,这对于一个评论来说已经足够了。