Matlab For循环仅用于矩阵的"shell"

Mik*_*ike 5 algorithm matlab loops for-loop matrix

取一组随机坐标(x,y,z),它将成为我的3x3x3矩阵的中心(也被视为局部最小值).我有一个函数J,它接受那些坐标,进行计算并返回一个数字.如果这26个点中的任何一个更小,那将是我下一个矩阵的中心.如果我没有找到一个较小的值,矩阵的半径增加1,我们再次运行循环.我的问题是:如何仅通过多维数据集的"shell"循环而不调用以前测试的值的函数?

我试着在下面说明它(这里是2d,但你明白了)..点是被测试的值,"?" 需要计算并与当地最小值进行比较的是那些.

在此输入图像描述

这是代码

minim=100;

%%the initial size of the search matrix 2*level +1
level=1;
x=input('Enter the starting coordinate for X : ');
y=input('Enter the starting coordinate for Y : ');
z=input('Enter the starting coordinate for Z : ');

%%The loop
if(level<=10)
for m=x-level:x+level
    for n=y-level:y+level
        for p=z-level:z+level
            A(m,n,p)=J(m,n,p);
            if A(m,n,p)<minim
               minim=A(m,n,p);
               x=m;y=n;z=p;
               level=1;
            else
                level=level+1;

                %<<----shell loop here ---->>

            end

        end
    end
    end
else

%Display global min
display(minim, 'Minim');
%Coordinates of the global min
[r,c,d] = ind2sub(size(A),find(A ==minim));

display(r,'X');
display(c,'Y');
display(d,'Z');
end
Run Code Online (Sandbox Code Playgroud)

小智 1

这是一个简单的 C++ 解决方案

这是一个用 2D 表示的 5x5x5 立方体:

a[i][j][0]
1   1   1   1   1   
1   1   1   1   1   
1   1   1   1   1
1   1   1   1   1
1   1   1   1   1

a[i][j][1]
1   1   1   1   1
1   0   0   0   1   
1   0   0   0   1
1   0   0   0   1
1   1   1   1   1

a[i][j][2]
1   1   1   1   1
1   0   0   0   1   
1   0   0   0   1
1   0   0   0   1
1   1   1   1   1

a[i][j][3]
1   1   1   1   1
1   0   0   0   1   
1   0   0   0   1
1   0   0   0   1
1   1   1   1   1

a[i][j][4]
1   1   1   1   1   
1   1   1   1   1
1   1   1   1   1
1   1   1   1   1
1   1   1   1   1
Run Code Online (Sandbox Code Playgroud)

这是立方体解析的代码:

int a[5][5][5]
int matrix_size = 2*level+1;

for(int z=0;z<matrix_size;z++)

if(z==0 || z= matrix_size-1)
{
    for(int i=0;i<matrix_size-1;i++)
        for(int j=0;j<matrix_size-1;j++)
            {
                //compare minim with  a[i][j][z];
            }
}
else
    for(int i=0;i<matrix_size-1;i++)
        {
            if(i==1 || i==matrix_size-1)
                {   
                    for(int j=0;j<matrix_size-1;j++)
                        //compare minim with  a[i][j][z];
                }
            else
                {
                    //compare minim with  a[i][1][z] and  a[i][matrix_size-1][z];
                }
        }
Run Code Online (Sandbox Code Playgroud)