2011-09-16 260 views
1

我有我的功能在下面,這個想法是,X是從循環中使用T的3x3提取,它正確地提取3行,但由於某種原因產生太多列,請參閱下面的示例。矩陣尺寸matlab

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

如果您完成一項完整的任務,則無需預先分配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不補零的外邊界)。

+0

工作,歡呼,你說得對我想在工作時不要改變T,最後輸出成品。 – Jordan

+0

然後,在for循環之前加上'T2 = T;'並從'T2'而不是從'T'讀取'X'。或者檢查'conv2' ... –

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