matlab中的矩阵
我试图让函数输出一个数组T,它的每个值都在固定的外部行和列中,用它自身和它周围的4个数字求平均值。我让X从我的大数组中接收所有9个值,S只选择我想要的值,A在求平均值时使用,但它不起作用,我相信问题在于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
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))
toX=T([(ii-1)ii(ii+1)],[(jj-1)jj(jj+1)])
这更接近我需要的,它正确地得到了T的前3行,但不是得到T的前3列,而是以某种方式返回了9列:@Jordan:yourjj
变量是一个向量,所以我想这就是导致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