0

こんにちは、論理的な友達です!これは非常に複雑な質問であることは承知していますので、ご容赦ください。私はそれを 2 つの詳細にまとめることができたと思います:- 動作していないように見える 2 つのループが必要です... 変数 rollers(1).ink は、インク値を含む (12x1) ベクトルです。このプログラムは、各接続のローラー間でインクを均等に共有します。私は、ローラー(1).インクを特定のタイムステップでのみローラー(2)と相互作用させようとしています。インクは、完全な 1 回転ごとに 1 回システムに転送される必要があります。つまり、nTimesSteps = nBins_max の各倍数です。インクは、システムが回転するときに、rollers(1).ink に戻ってはいけません。1 回転ごとに 1 回だけインクをシステムに導入し、元に戻してはなりません。現在、私は rollers(1).ink = ones を設定しましたが、テスト用です。私は本当にここで立ち往生しています!第二に; これを行う必要がある理由は、sim の最後に、印刷された画像の形でインクも削除したいからです。画像はシステムの最後のローラーのインクの反射である必要があり、この値の半分は最後のローラーから削除され、各回転でシステムから取り出される必要があります。最後のローラーに残ったインクはリサイクルされ、次の回転に備えてシステム内で「再分割」されます。だから…86行目から始まるループあたりで、このすべてを行う必要があると思います。擬似的に、断続的なインフィードのために、私は次のようなことを試みてきました: 最後のローラーに残ったインクはリサイクルされ、次の回転に備えてシステム内で「再分割」されます。だから…86行目から始まるループあたりで、このすべてを行う必要があると思います。擬似的に、断続的なインフィードのために、私は次のようなことを試みてきました: 最後のローラーに残ったインクはリサイクルされ、次の回転に備えてシステム内で「再分割」されます。だから…86行目から始まるループあたりで、このすべてを行う必要があると思います。擬似的に、断続的なインフィードのために、私は次のようなことを試みてきました:

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]';
4

1 に答える 1

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]

つまり、トリプレットの 2 番目の数値は、連続する要素間のストライドです。

マトリックスには、ローラーが接続されconnている場所に 1 があり、他の場所には 0 があります。次のよう(row,col)に、すべての の行と列のインデックスを見つけることができます。1

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

次に、ループのネストなしで s の(row,col)場所を取得でき、開始する if ステートメント1

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

私は続けることができますが、それは 1 つのコメントで十分です。

于 2013-03-21T22:50:18.990 に答える