Размеры матрицы Matlab - PullRequest
       9

Размеры матрицы Matlab

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

У меня есть моя функция ниже, идея в том, что X - это извлечение 3x3 из T для использования в цикле, оно правильно извлекает 3 строки, но по некоторым причинам выдает слишком много столбцов, см. Пример ниже.

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 = T([(ii-1) ii (ii+1)], [(jj-1) jj (jj+1)])
        A = X.*S;
        T = (sum(sum(A)))/5 
    end

тестовый образец

EDU>> T = tempsim(5,4,100,50,0)

X =

   100   100   100   100   100   100   100   100   100
   100     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0   100


ans =

   100   100   100   100   100   100   100   100   100
   100     0     0     0     0     0     0     0   100
   100     0     0     0     0     0     0     0   100

??? Error using ==> times
Matrix dimensions must agree.

Error in ==> tempsim at 14
    A = X.*S;

есть мысли как это исправить?

Ответы [ 2 ]

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

Нет необходимости предварительно выделять X и A, если вы все равно выполняете полное назначение.Затем вы заменяете T скаляром внутри цикла, что приводит к проблемам в следующей итерации.То, что я предполагаю, что вы хотите, может выглядеть примерно так:

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]; 
  for ii = 1:(cols-2);
    for jj = 1:(rows-2);
      X = T(ii:ii+2, jj:jj+2);
      A = X.*S;
      T(ii,jj) = (sum(sum(A)))/5;
    end
  end

Хотя я не уверен, действительно ли вы хотите это сделать - вы работаете над T, изменяя его.Как дикое предположение, я подозреваю, что вы могли бы искать что-то вроде

conv2(T, S/5, 'same')

вместо этого, возможно, после того, как ваши фиксированные временные границы были в два раза толще и перенастроили их после вызова (посколькузаполнение нулями на внешних границах).

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

Здесь:

jj = 2:(rows-1);
X = T([(ii-1) ii (ii+1)], [(jj-1) jj (jj+1)])

jj становится [2 3 4]

, поэтому X равен

T([1 2 3], [ [2 3 4]-1 [2 3 4] [2 3 4]+1 ])

Возможно, вы пропустили цикл for.

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