我的下面有我的功能,想法是X是一个3x3的T提取,用于循环,它正确地提取3行但由于某种原因产生了太多的列,请参见下面的示例。
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;
关于如何解决此问题的任何想法?
答案 0 :(得分:2)
如果您完成任务,则无需预先分配X
和A
。然后,用循环内的标量替换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
在外边框处进行零填充)。
答案 1 :(得分: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循环。