Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 具有两个输入的函数的前N个值_Arrays_Matlab_Combinations - Fatal编程技术网

Arrays 具有两个输入的函数的前N个值

Arrays 具有两个输入的函数的前N个值,arrays,matlab,combinations,Arrays,Matlab,Combinations,我有一个具有两个整数输入的函数,如下所示: function f = func(n, m) a = 2; b = 1; f = sqrt((n/a)^2 + (m/b)^2); end m和n是大于或等于零的整数。f的前两个值及其出现的输入如下: n---m---f 0---0---0 1---0---0.5 2---0---1 0---1---1 1---1---1.118 等等。我想得到f的前N个值以及它们各自的N和m。在matlab中有没有一种简单的方法可以做到这

我有一个具有两个整数输入的函数,如下所示:

function f = func(n, m)
    a = 2;
    b = 1;
    f = sqrt((n/a)^2 + (m/b)^2);
end
m和n是大于或等于零的整数。f的前两个值及其出现的输入如下:

n---m---f

0---0---0

1---0---0.5

2---0---1

0---1---1

1---1---1.118

等等。我想得到f的前N个值以及它们各自的N和m。在matlab中有没有一种简单的方法可以做到这一点?

像这样的东西(可能效率很低)

N = 100 % stop 
i = 0
n = 0
m = 0
nout = [n]
mout = [m]
fout = [f(n,m)]
while i ~= N
    a = f(n+1,m)
    b = f(n,m+1)
    if (a > b)
        m = m + 1
        nout = [nout n]
        mout = [mout m]
        fout = [fout b]
    else 
        n = n + 1
        nout = [nout n]
        mout = [mout m]
        fout = [fout a]
    end if
    i = i + 1
end while
像这样的东西(可能效率很低)

N = 100 % stop 
i = 0
n = 0
m = 0
nout = [n]
mout = [m]
fout = [f(n,m)]
while i ~= N
    a = f(n+1,m)
    b = f(n,m+1)
    if (a > b)
        m = m + 1
        nout = [nout n]
        mout = [mout m]
        fout = [fout b]
    else 
        n = n + 1
        nout = [nout n]
        mout = [mout m]
        fout = [fout a]
    end if
    i = i + 1
end while
并可用于生成输入范围的输出数组

代码 可以修改这两个值向量,以获得所需的值范围

输出
要给出类似问题中矩阵的结果,可以使用以下方法(谢谢@Divakar)

并可用于生成输入范围的输出数组

代码 可以修改这两个值向量,以获得所需的值范围

输出
要给出类似问题中矩阵的结果,可以使用以下方法(谢谢@Divakar)

代码

%// Parameters
N = 5
a = 2;
b = 1;

%// Extents of n and m would be from 0 to N-1 to account for all possible
%// minimum values of f results resulting from their use 
len1 = N-1

%// Create n and m for maximum possible combinations scenario, but save
%// them as n1 and m1 for now, as the final ones would be chopped versions
%// of them.
[n1,m1] = ndgrid(0:len1,0:len1)

%// Get corresponding f values, but store as f1, for the same chopping reason
f1 = sqrt((n1(:)./a).^2 + (m1(:)./b).^2);

%// Sort f1 so that the smallest N values from it could be choosen and also
%// get the selected row indices based on the sorting as row1
[f1,row1] = sort(f1)

%// Choose n and m based on the sorted indices and also chop off at N.
%// Use these n and m values to finally get f
n = n1(row1(1:N))
m = m1(row1(1:N))
f = f1(1:N)
输出

当N=5时,您将得到-

n =
     0
     1
     2
     0
     1

m =
     0
     0
     0
     1
     1

f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
n =
     0
     1
     2
     0
     1
     2
     3
     3
     4
m =
     0
     0
     0
     1
     1
     1
     0
     1
     0
f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
    1.4142
    1.5000
    1.8028
    2.0000
当N=9时,您将得到-

n =
     0
     1
     2
     0
     1

m =
     0
     0
     0
     1
     1

f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
n =
     0
     1
     2
     0
     1
     2
     3
     3
     4
m =
     0
     0
     0
     1
     1
     1
     0
     1
     0
f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
    1.4142
    1.5000
    1.8028
    2.0000
代码

%// Parameters
N = 5
a = 2;
b = 1;

%// Extents of n and m would be from 0 to N-1 to account for all possible
%// minimum values of f results resulting from their use 
len1 = N-1

%// Create n and m for maximum possible combinations scenario, but save
%// them as n1 and m1 for now, as the final ones would be chopped versions
%// of them.
[n1,m1] = ndgrid(0:len1,0:len1)

%// Get corresponding f values, but store as f1, for the same chopping reason
f1 = sqrt((n1(:)./a).^2 + (m1(:)./b).^2);

%// Sort f1 so that the smallest N values from it could be choosen and also
%// get the selected row indices based on the sorting as row1
[f1,row1] = sort(f1)

%// Choose n and m based on the sorted indices and also chop off at N.
%// Use these n and m values to finally get f
n = n1(row1(1:N))
m = m1(row1(1:N))
f = f1(1:N)
输出

当N=5时,您将得到-

n =
     0
     1
     2
     0
     1

m =
     0
     0
     0
     1
     1

f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
n =
     0
     1
     2
     0
     1
     2
     3
     3
     4
m =
     0
     0
     0
     1
     1
     1
     0
     1
     0
f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
    1.4142
    1.5000
    1.8028
    2.0000
当N=9时,您将得到-

n =
     0
     1
     2
     0
     1

m =
     0
     0
     0
     1
     1

f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
n =
     0
     1
     2
     0
     1
     2
     3
     3
     4
m =
     0
     0
     0
     1
     1
     1
     0
     1
     0
f =
         0
    0.5000
    1.0000
    1.0000
    1.1180
    1.4142
    1.5000
    1.8028
    2.0000


我在这里要做的是计算函数的正确输入值,以避免遗漏中间的任何内容,并获得连续的输出。我不能用手来做,因为N可能有点大。我想我误解了这个问题。你想为[0..N]中的所有值对计算f,对吗?不对。在我上面给出的例子中,我已经计算了f的前5个值。但为了做到这一点,我尝试了m和n的不同值组合,以确保这些f的值不能在0到1.118范围内。问题是,我需要的不是5,而是f的前100个值,我不知道使用什么样的输入组合。我现在明白了。实际上,您是在抛物面上对数字进行排序:^2+%2B+y^2效率不高,但您可以简单地逐步遍历n和m的值,在一个数字上增加1,计算特定(n,m)对的func值,并在较小的f值上增长向量。有时,当我将一个输入值增加一个时,如果我减少另一个输入值,我会编辑我的PostActual,我得到的f值与前一个值更接近。就像我的例子中的(2,0)和(0,1)一样,我在这里要做的是计算函数的正确输入值,以避免遗漏中间的任何内容,并获得连续的输出。我不能用手来做,因为N可能有点大。我想我误解了这个问题。你想为[0..N]中的所有值对计算f,对吗?不对。在我上面给出的例子中,我已经计算了f的前5个值。但为了做到这一点,我尝试了m和n的不同值组合,以确保这些f的值不能在0到1.118范围内。问题是,我需要的不是5,而是f的前100个值,我不知道使用什么样的输入组合。我现在明白了。实际上,您是在抛物面上对数字进行排序:^2+%2B+y^2效率不高,但您可以简单地逐步遍历n和m的值,在一个数字上增加1,计算特定(n,m)对的func值,并在较小的f值上增长向量。有时,当我将一个输入值增加一个时,如果我减少另一个输入值,我会编辑我的PostActual,我得到的f值与前一个值更接近。就像我的例子中的(2,0)和(0,1)一样。使用
0,1和2
你会在
f
中得到多达
9
的值,那么如果你的
N
大于
9
?或者你的意思是像
0,1,2,3等等直到N
?在这个例子中,N是5,所以我得到了f的前5个值。正如您在(2,0)之后看到的,输入是(0,1),以获得与前一个最接近的f值。所以他们没有任何一般的秩序。我需要找到n和m的正确顺序,以按升序计算f。您可以使用任意答案,然后对结果进行排序,并取前n个元素。不明显的一点是要计算的网格n*m的大小,以确保不丢失任何值,因为它强烈地依赖于函数
func
。使用
0、1和2
,您将在
f
中获得多达
9
的值,因此如果
n
大于
9
,该怎么办?或者你的意思是像
0,1,2,3等等直到N
?在这个例子中,N是5,所以我得到了f的前5个值。正如您在(2,0)之后看到的,输入是(0,1),以获得与前一个最接近的f值。所以他们没有任何一般的秩序。我需要找到n和m的正确顺序,以按升序计算f。您可以使用任意答案,然后对结果进行排序,并取前n个元素。不明显的一点是要计算的网格n*m的大小,因为它强烈地依赖于函数
func
。这不应该是
ii(:)
jj(:)
arrayfun
?使用
meshgrid
btw是个好主意+1好主意,我将添加设置,使其与使用ii(:)和jj(:)给出的格式相匹配。它实际上接近我要查找的内容。我应该对这些结果进行排序,并选择其中的前N个。难道没有一种方法不需要计算额外的结果吗?对于给定的函数,可能通过计算m&n值之间的关系来获得相同的结果(例如[2x,0]&[0,x]),尽管假设这只是一个示例函数。我无法想象当考虑将它用于许多不同的f时,它会比暴力更有效