2011-09-16 4 views
1

J'ai ma fonction ci-dessous, l'idée étant que X est un extrait 3x3 de T à utiliser dans la boucle, il extrait correctement les 3 lignes mais produit pour beaucoup de colonnes, voir l'exemple ci-dessous.matrice dimensions 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 

échantillon test

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; 

des idées sur la façon de résoudre ce problème?

Répondre

2

Il n'est pas nécessaire de préallouer X et A si vous effectuez une affectation complète de toute façon. Ensuite, vous remplacez T par un scalaire à l'intérieur de la boucle, ce qui vous cause des problèmes lors de l'itération suivante. Ce que je devine que vous voulez pourrait ressembler à ceci:

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 

Bien que je ne suis pas sûr si vous voulez réellement faire - vous travaillez sur T tout en le modifiant. En tant que conjecture sauvage, je suppose que vous cherchez peut-être quelque chose comme

à la place
conv2(T, S/5, 'same') 

, peut-être après avoir fait vos frontières-temp fixe deux fois plus épais et re-mettre les après l'appel (depuis conv2-t zéro padding les frontières extérieures).

+0

ça marche, bravo, vous avez raison Je voudrais que le T ne change pas pendant que je travaille dessus et à la fin produise le produit fini. – Jordan

+0

Ensuite, ajoutez 'T2 = T;' avant les boucles for et lisez 'X' de' T2' au lieu de 'T'. Ou vérifiez 'conv2' ... –

1

ici:

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

devient J.-J. [2 3 4]

SOx est

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

Vous avez probablement raté une boucle.

Questions connexes