如何将重复的结构分配模式压缩为更简单的表达式?

时间:2017-11-20 19:39:11

标签: matlab class struct readability simplify

我正在编写代码以在NI * NJ大小的网格上执行有限体积方法操作,其中所有值都存储在一维数组中,在注释部分1中定义。双循环移动每个网格元素并执行计算对于网格元素,它是周围元素(东,北,西,南)的各种功能。

我在下面有一个示例代码块,我的挑战是清理代码以消除我看到的一些重复。我想知道是否以某种方式使用包含属性e, w, n, s的类将是一个有益的方法解决问题,虽然我不精通类构造。

可以看出,我已经定义了一个匿名函数,然后调用它来计算每一侧的某个值(e,w,n,s)。这种模式在整个代码中多次重复出现,将一些四元组代码块组合成一行简单代码会更好。

arrayRe = initialize;  % goes from 1:(NI*NJ)
arrayRn = initialize;

for i = 2:NI-1
  for j = 2:NJ-1

    % 1. coordinates (P is the center; all others are located around it (north, east, west, south))
    iP  = NI*(j-1) + i;
    iE = iP + 1;
    iW = iP - 1;
    iN = iP + NI;
    iS = iP - NI;

    % 2. interpolation ratios 
    R.e = arrayRe(iP);  
    R.w = 1 - arrayRe(iW);
    R.n = arrayRn(iP);
    R.s = 1 - arrayRn(iS);

    % interpolate a given value
    interpolatevalue = @(array, R, i) ...
                         R*array(i)  +   (1-R)*array(iP);

    % ax calc
    ax_e = interpolatevalue(axArray, R.e, iE); 
    ax_w = interpolatevalue(axArray, R.w, iW);
    ay_n = interpolatevalue(ayArray, R.n, iN);
    ay_s = interpolatevalue(ayArray, R.s, iS);    

    % bx calc
    bx_e = interpolatevalue(bxArray, R.e, iE); 
    bx_w = interpolatevalue(bxArray, R.w, iW);
    by_n = interpolatevalue(byArray, R.n, iN);
    by_s = interpolatevalue(byArray, R.s, iS); 

  end
end

我试过的东西是删除特定块的4行并将它们放入返回结构的函数m文件中。例如:

function a = axycalc(axArray, ayArray, R, iStruct, interpfun)

    iE = iStruct.e ;
    iW = iStruct.w ;
    iS = iStruct.s ;
    iN = iStruct.n ;

    a.x_e = interpfun(axArray, R_e, iE); 
    a.x_w = interpfun(axArray, R_w, iW);
    a.y_n = interpfun(ayArray, R_n, iN);
    a.y_s = interpfun(ayArray, R_s, iS); 

end

然后按如下方式调用该函数:

a = axycalc(axArray, ayArray, R, struct('e',iE,'w',iW,'n',iN,'s',iS), @interpolatevalue)

我不知道这在可读性方面是否增加了很多,并且创建了大量其他m 10行m文件,然后我需要跟踪它们。还有更好的方法吗?

0 个答案:

没有答案