来自矩阵matlab的矩阵

时间:2011-09-16 06:27:15

标签: 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,:) = 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

1 个答案:

答案 0 :(得分:1)

正如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等于T00的相同位置。

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

但是根据您的实际问题,我认为您可以通过将网格初始化为不同于0的温度来改善初始条件以加快收敛速度​​。在当前代码中,您的边界条件将加热整个网格,这需要一些时间。如果你只是提供一个适当的体积温度猜测(代替50),这可以大大加快收敛速度​​。在我的例子中,我需要大约40个步骤来收敛到一定的容差,并进行适当的猜测(在我的情况下为 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 )对于相同的容差水平,这可以减少到大约20步。对于更大的电网,我预计效率会有更大的提升。

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

{{1}}

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