матрица из матрицы - PullRequest
       5

матрица из матрицы

0 голосов
/ 16 сентября 2011

Я пытаюсь получить функцию для вывода массива T, каждое из которых имеет значение внутри фиксированных внешних строк и столбцов, усредненных с самим собой и 4 числами, окружающими его.Я сделал X, чтобы получить все 9 значений из моего большего массива, S, чтобы выбрать только те, которые я хотел, и A, чтобы использовать при усреднении, но это не будет работать, я считаю, что проблема заключается в X(ii,jj) = T((ii-1):(ii+1), (jj-1):(jj+1)).Любая помощь высоко ценится

function T = tempsim(rows, cols, topNsideTemp, bottomTemp, tol)
T = zeros(rows,cols);
T(1,:) = topNsideTemp;
T(:,1) = topNsideTemp;
T(:,rows) = topNsideTemp;
T(rows,:) = bottomTemp;
S = [0 1 0; 1 1 1; 0 1 0]; 
X = zeros(3,3);
A = zeros(3,3);
for ii = 2:(cols-1);
    jj = 2:(rows-1);
    X(ii,jj) = T((ii-1):(ii+1), (jj-1):(jj+1))
    A = X.*S;
    T = (sum(sum(A)))/5

1 Ответ

1 голос
/ 16 сентября 2011

То, что вы делаете, похоже на свертку, как указывает Джуни.Поэтому, используя эти знания, я придумал следующий код:

function T = tempsim(rows, cols, topNsideTemp, bottomTemp, tol)
sz = [rows,cols];

topEdge    = sub2ind(sz, ones(1,cols)     , 1:cols);
bottomEdge = sub2ind(sz, ones(1,cols)*rows, 1:cols);
leftEdge   = sub2ind(sz, 1:rows           , ones(1,rows));
rightEdge  = sub2ind(sz, 1:rows           , ones(1,rows)*cols);

otherEdges = [topEdge leftEdge rightEdge];
edges      = [bottomEdge otherEdges];

%% set initial grid
T0             = zeros(sz);
T0(otherEdges) = topNsideTemp;
T0(bottomEdge) = bottomTemp;

%% average filter
F = [0 1 0 
     1 1 1 
     0 1 0]; 
F = F/sum(F(:));

%% simulation
T = T0; % initial condition
T = conv2(T, F, 'same');
T(edges) = T0(edges); % this keeps the edges set to the initial values

Если вы запустите это, вы получите следующие результаты:

T = tempsim(10,10,100,-100)
T0 =

   100   100   100   100   100   100   100   100   100   100
   100     0     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0     0   100
   100  -100  -100  -100  -100  -100  -100  -100  -100   100


T =

   100   100   100   100   100   100   100   100   100   100
   100    40    20    20    20    20    20    20    40   100
   100    20     0     0     0     0     0     0    20   100
   100    20     0     0     0     0     0     0    20   100
   100    20     0     0     0     0     0     0    20   100
   100    20     0     0     0     0     0     0    20   100
   100    20     0     0     0     0     0     0    20   100
   100    20     0     0     0     0     0     0    20   100
   100     0   -20   -20   -20   -20   -20   -20     0   100
   100  -100  -100  -100  -100  -100  -100  -100  -100   100

Я также показал T0 для ясности каквы можете видеть, что T(2,2) == 40, что равно (100 + 100 + 0 + 0 + 0)/5 из той же позиции в T0.

Исходя из контекста, я думаю, вы будете изучать сходимость этой проблемы.Если это так, вам придется повторять последние 2 строки, пока они не сойдутся.

Но в зависимости от вашей реальной проблемы, я думаю, вы можете улучшить начальные условия для ускорения сходимости, инициализируя сетку с температурой, отличной от 0.В текущем коде ваши граничные условия будут нагревать всю сетку, что занимает некоторое время.Если вы просто дадите правильное предположение для объемной температуры (вместо 0), это может значительно ускорить сходимость.В моем примере мне нужно около 40 шагов для сходимости до определенного допуска, с правильным предположением (50 в моем случае) это может быть уменьшено примерно до 20 шагов для того же уровня допуска.Для более крупной сетки я ожидаю увидеть еще больший прирост эффективности.

Это сходится к следующим значениям (и зеркальному отображению для других значений):

      100          100          100          100          100
      100       96.502       93.464       91.254       90.097
      100       92.989       86.925       82.533       80.245
      100       89.229       79.995       73.386       69.974
      100       84.579       71.615       62.556       57.963
      100        77.78        59.86       47.904       42.037
      100       66.515       41.786       26.614       19.565
      100       45.939       13.075      -4.3143       -11.72
      100       3.4985      -32.392      -46.997      -52.455
      100         -100         -100         -100         -100

Вы можете проверить, чтоЭто решение является приблизительной фиксированной точкой, проверяя, что для каждого элемента в массе оно равно вычисленному среднему значению в пределах определенного допуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...