Algorithm Matlab For loop仅适用于;壳牌公司;矩阵的

Algorithm Matlab For loop仅适用于;壳牌公司;矩阵的,algorithm,matlab,loops,for-loop,matrix,Algorithm,Matlab,Loops,For Loop,Matrix,取一组随机坐标(x,y,z),它将是我的3x3x3矩阵的中心(也被认为是局部最小值)。我有一个函数J,它接受这些坐标,进行计算并返回一个数字。如果这26个点中的任何一个更小,那将是我下一个矩阵的中心。如果我找不到更小的值,矩阵的半径增加1,我们再次运行循环。我的问题是:如何只在多维数据集的“外壳”中循环,而不为之前测试的值调用函数? 我试着在下面举例说明(这里是2d,但你明白了)。。点是测试的值,“?”是需要计算并与局部最小值进行比较的值 这是密码 minim=100; %%the init

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

我试着在下面举例说明(这里是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
minim=100;
%%搜索矩阵的初始大小为2*level+1
级别=1;
x=输入('输入x的起始坐标:');
y=输入('输入y的起始坐标:');
z=输入('输入z的起始坐标:');
%%环路

如果(level可以使用逻辑索引,我不确定这样做是否能提高速度。重建min的位置有点笨拙,但这样就可以去掉所有for循环

A = rand(7,7,7);
%"shell" mask for extraction
B = ones(5,5,5);
B = padarray(B,[1,1,1]);
B = logical(abs(B-1));

[val, ind] = min(A(B))

%reconstruct location
tmp = zeros(1,sum(B(:)));
tmp(ind) = 1;
C = zeros(size(A));
C(B) = tmp;
[~, ind] = max(C(:));
[r,c,d] = ind2sub(size(A),ind);

这里有一种方法可以在单个循环中访问所有“shell”元素:

clear;
%// a cube matrix to play with
A=nan(5,5,5);

n=length( A(:,1,1) ); %// Assuming cube matrix
%// lets change all ot the "shell" elements to 1
for i=1:n
        % 1st and nth level
        A(1,i,1)=1;
        A(i,1,1)=1;
        A(n,i,1)=1;
        A(i,n,1)=1;
        A(1,i,n)=1;
        A(i,1,n)=1;
        A(n,i,n)=1;
        A(i,n,n)=1;

        % 2nd to (n-1)th level
        A(1,1,i)=1;
        A(1,n,i)=1;
        A(n,1,i)=1;
        A(n,n,i)=1;
end
请注意,角元素不止一次到达。生成的矩阵:

>> A
A(:,:,1) =
     1     1     1     1     1
     1   NaN   NaN   NaN     1
     1   NaN   NaN   NaN     1
     1   NaN   NaN   NaN     1
     1     1     1     1     1

A(:,:,2) =   
     1   NaN   NaN   NaN     1
   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN
     1   NaN   NaN   NaN     1

A(:,:,3) =
     1   NaN   NaN   NaN     1
   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN
     1   NaN   NaN   NaN     1

A(:,:,4) =   
     1   NaN   NaN   NaN     1
   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN
     1   NaN   NaN   NaN     1

A(:,:,5) =   
     1     1     1     1     1
     1   NaN   NaN   NaN     1
     1   NaN   NaN   NaN     1
     1   NaN   NaN   NaN     1
     1     1     1     1     1

这里是一个简单的C++解决方案< /P> 这是一个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
下面是多维数据集解析的代码:

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];
                }
        }
inta[5][5]
int矩阵_size=2*级别+1;

对于(int z=0;zIt听起来像是你在尝试做一些优化。你是否考虑过使用内置的
MATLAB
函数,例如?@Jeff Irwin如果我错了请纠正我,但是使用fminsearch或任何其他优化方法,你不需要在对它们进行操作之前拥有所有变量吗?我的函数是凸函数(不完美!这就是我使用level变量的原因。如果我将半径增加10倍,那就是21x21x21,并且我没有发现另一个变量小于局部最小值,我得出结论,那就是全局最小值)我正在朝着全局最小值迈出一小步,而没有计算所有值。我不确定“拥有所有变量”是什么意思fminsearch会在函数运行时对其进行评估。您不需要提前对函数进行评估。一些优化算法也需要评估函数的梯度,但fminsearch不需要梯度。谢谢Jeff,在这种情况下,我将尝试实现这两种算法,并选择最快的一种。太好了!很高兴它有帮助