矩阵维数matlab

时间:2011-09-16 07:40:41

标签: matlab matrix indexing

我的下面有我的功能,想法是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 个答案:

答案 0 :(得分:2)

如果您完成任务,则无需预先分配XA。然后,用循环内的标量替换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')

相反,也许在使你的固定温度边框厚两倍并在调用后重新设置它们之后(因为conv2在外边框处进行零填充)。

答案 1 :(得分:1)

下面:

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循环。