我有一个用于域的10*10数组
TT=
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
,但我需要排除以域为中心的正方形,所以新域将是:
TT_new=
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
我将为域TT_new创建一个for循环,我如何在MATLAB中进行此操作?
澄清:我需要for循环通过";i、 j";新域的";TT_new";。
例如,对于U形板的稳态热传导问题,我有以下网格图:
2D图
3D绘图
我需要从图中排除紫色矩形,因为它不在计算域内。
你想过使用口罩吗?
你不能有带孔的矩阵,但如果你将原始数组与一个处处包含1、处处包含0的矩阵逐元素相乘,你的结果将是一个处处都包含原始数字的数组,但掩码中有零的地方是零。例如:
my_arr = reshape(1:30, 5, 6);
my_mask = ones(5, 6);
my_mask(1:3, 3:4) = 0;
masked_arr = my_arr .* my_mask;
这给出:
my_arr =
1 6 11 16 21 26
2 7 12 17 22 27
3 8 13 18 23 28
4 9 14 19 24 29
5 10 15 20 25 30
my_mask =
1 1 0 0 1 1
1 1 0 0 1 1
1 1 0 0 1 1
1 1 1 1 1 1
1 1 1 1 1 1
masked_arr =
1 6 0 0 21 26
2 7 0 0 22 27
3 8 0 0 23 28
4 9 14 19 24 29
5 10 15 20 25 30
这是否适用于您的情况取决于您在计算中如何使用计算域的边界。与包含NaN的掩码相乘会将不需要的元素更改为NaN。
然后,您可以在每次迭代之前(或之后,或两者兼而有之(应用掩码,以确保不需要的元素设置为零(或NaN,但如果您将这些元素与任何元素相加/相减/相乘,可能会导致问题(。
domain_mask = ones(size(T));
domain_mask(7:16, 12:31) = 0;
domain_mask_small = domain_mask(2:end-1, 2:end-1);
zero_row = zeros(1, size(T, 2));
zero_col = zeros(size(T, 1), 1);
while error > tol
% Perform operations on the entire array
T_iplus1 = [T(2:end, :); zero_row];
T_iminus1 = [zero_row; T(1:end-1, :)];
T_jplus1 = [T(:, 2:end), zero_col];
T_jminus1 = [zero_col, T(:, 1:end-1)];
T_temp = 0.25 * (T_iplus1 + T_iminus1 + T_jplus1 + T_jminus1);
T(2:end-1, 2:end-1) = T_temp(2:end-1, 2:end-1) .* domain_mask_small;
% Do whatever else
end