将范围分成N个相等的数字

时间:2014-05-08 05:53:19

标签: c matlab

我正在尝试在C中实现Matlab的linspace函数。我对如何制作该算法感到困惑。

如果假设我有一个数字s = 6 ..那么范围将是-6到6.

如果Even ..

在这个范围内,如果我需要假设4个相等的数字,那么输出将是-6,-2,2,6。

如果我需要6个相等的数字,那么输出将是-6,-3.6,-1.2,1.2,3.6,6。

如果奇怪......

如果我需要假设5个相等的数字,那么输出将是-6,-3,0,3,6

如果我需要假设7个相等的数字,那么输出将是-6,-4,-2,0,2,4,6

我该如何处理这个过程?

3 个答案:

答案 0 :(得分:1)

我不确定这是否正确。但举个例子。 s = 6,范围= -6至6

案例:即使n = 4 -6到6,我们有12个单位,12/(n-1) = size of a single unit = 12/(4-1) = 4 所以从-6, (-6+4)=-2, (-2+4)=2, (4+2)=6

开始

案例:奇数n = 5 一个数字是0.现在我们需要4个数字,0左边2个,0右边2个。 -6到0我们有6个单位/ 2 = 3 所以从-6, (-6+3)=3, 0, (0+3)=3, (3+3)=6

开始

答案 1 :(得分:0)

public static void findRange(int n, int gaps)   {
    int totalRange = 2*n;
    ArrayList rangeValues = new ArrayList();
    if(totalRange%gaps == 0)
    {
        int gapValInt = totalRange / gaps;  
        int j=0;
        for(int i = -n ; i <=n ; i=i+gapValInt )
        {
            rangeValues.add(i);
        }
    }
    else
    {
        float val;
        float gapValFloat = (float)totalRange / gaps;
        for(int i = 0 ; i <= gaps ; i++)
        {
            val = -n + gapValFloat * i; 
            rangeValues.add(Math.round(val*10.0)/10.0);
        }
    }
    for(Object o : rangeValues)
    {
        System.out.println(o.toString());
    }
}

答案 2 :(得分:0)

linspace(a, b, n)可以像这样实现(伪代码):

step = (b-a)/(n-1)
return (a, a+step*1, a+step*2, ..., b)

在C:

#include <stdio.h>
#include <stdlib.h>

float *
linspace(int a, int b, int n) {
    int i;
    float *arr, step;

    arr = malloc(sizeof(*arr) * n);
    if (arr == NULL) {
        perror("malloc");
        return NULL;
    }

    step = (b - a)/(n-1.0);
    for (i = 0; i < n; i++) {
        arr[i] = a + step * i;
    }

    return arr;
}