matlab中的矩阵

matlab中的矩阵,matlab,matrix,Matlab,Matrix,我试图让函数输出一个数组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,:) = topNs

我试图让函数输出一个数组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

正如Jouni所指出的,你所做的看起来像是一个卷积。利用这些知识,我想出了以下代码:

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
的相同位置

从上下文来看,我想你会研究这个问题的收敛性。如果是这种情况,则必须重复最后两行,直到收敛

但根据实际问题,我认为可以通过将网格初始化为不同于
0
的温度来改善初始条件以加快收敛速度。在当前代码中,边界条件将加热整个网格,这需要一些时间。如果您只是提供一个适当的体积温度猜测(代替
0
),这可以大大加快收敛速度。在我的例子中,我需要大约40个步骤来收敛到某个公差,如果有适当的猜测(
50
,在我的例子中),对于相同的公差水平,这可以减少到大约20个步骤。对于更大的电网,我希望在效率方面有更大的提高

这会收敛到以下值(以及其他值的镜像):


您可以通过验证批量中每个元素的近似不动点是否等于某个公差内的计算平均值来验证此解决方案是否为近似不动点。

您在寻找吗?不,我正在尝试提取一个较小的矩阵,我可以在循环中使用它,从T开始,据我所知,卷积没有帮助我更改了
X(ii,jj)=T((ii-1):(ii+1),(jj-1):(jj+1))
to
X=T([(ii-1)ii(ii+1)],[(jj-1)jj(jj+1)])
这更接近我需要的,它正确地得到了T的前3行,但不是得到T的前3列,而是以某种方式返回了9列:@Jordan:your
jj
变量是一个向量,所以我想这就是导致9列的原因。
      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