Java版的matlab的linspace

时间:2011-06-01 23:26:58

标签: java matlab

是否有matlab的冒号运算符或linspace的java版本?例如,我想为均匀间隔的数字创建一个for循环,但我不想打扰手动创建这些数字的数组。

例如,为了得到1到30之间的所有整数,在matlab中我会输入:

1:30

linspace(1,30)

7 个答案:

答案 0 :(得分:5)

对于两个变量调用,@ x4u是正确的。三个变量调用将更难模仿。

例如,我认为linspace(1,30,60)应该产生值1,1.5,2,2.5,3,3.5 ......,或者可能是linspace的值(1,30) ,59) - 无论哪种方式,同样的问题。

使用这种格式你自己必须自己进行计算 - 我个人创建一个新对象来为我做整件事并忘记for循环。

counter=new Linspace(1,30,60);
while(counter.hasNext()) {
    process(counter.getNextFloat())
}

或只是

while(float f : new Linspace(1,30,60)) {
    process(f);
}

如果您的Linspace对象实现了Iterable。

然后计数器对象的内部应该非常明显地实现,它可以很容易地与你沟通它,而不会使用一堆数字计算来模糊你的代码来计算比率。

实现可能是这样的: (注意:未经测试,我非常确定这会容易受到边缘情况和浮点错误的影响!它也可能无法处理结束< start for backwardwards counting,它只是一个建议让你去。)

public class Linspace {
    private float current;
    private final float end;
    private final float step;
    public Linspace(float start, float end, float totalCount) {
        this.current=start;
        this.end=end;
        this.step=(end - start) / totalCount;
    }
    public boolean hasNext() {
        return current < (end + step/2); //MAY stop floating point error
    }
    public float getNextFloat() {
        current+=step;
        return current;
    }
}

答案 1 :(得分:3)

你想这样做吗?

for( int number = 1; number <= 30; ++number )

如果你需要它们间隔固定数量,即3,你可以这样写:

for( int number = 1; number <= 30; number += 3 )

for循环的左侧部分初始化变量,中间部分是在每次迭代之前得到评估的条件,右侧部分在每次迭代后执行。

答案 2 :(得分:3)

我实际上只是为我正在处理的java项目执行此操作。我想确保它的实现方式与MATLAB相同,所以我先写了一个MATLAB等价物:

function result = mylinspace(min, max, points)  
answer = zeros(1,points);  
    for i = 1:points  
answer(i) = min + (i-1) * (max - min) / (points - 1);  
end  
result = answer;  

我针对内置linspace函数对此进行了测试,并返回了正确的结果,因此我将其转换为静态java函数:

public static double[] linspace(double min, double max, int points) {  
    double[] d = new double[points];  
    for (int i = 0; i < points; i++){  
        d[i] = min + i * (max - min) / (points - 1);  
    }  
    return d;  
}  

在我看来,这比为这一个函数创建一个新类要简单得多。

答案 3 :(得分:1)

我自己在寻找这个问题的解决方案,并研究了MatLab如何实现其Linspace。我或多或少地将它转换为Java并最终得到了下面的方法。据我测试,它工作得很好,你得到了端点。与大多数情况一样,可能存在浮点错误。

我不确定是否存在版权问题。

public static List<Double> linspace(double start, double stop, int n)
{
   List<Double> result = new ArrayList<Double>();

   double step = (stop-start)/(n-1);

   for(int i = 0; i <= n-2; i++)
   {
       result.add(start + (i * step));
   }
   result.add(stop);

   return result;
}

答案 4 :(得分:0)

我认为Bill K得到了正确的想法,但我认为没有必要拥有Linspace类。

// If you write linspace(start,end,totalCount) in Matlab ===>

for(float i = start; i < end; i += (end-start)/totalCount)
    something(i);

答案 5 :(得分:0)

这是适用于matlab的主要算法,您可以将其转换为Java,并提供所有OOP详细信息:

>>> st=3;ed=9;num=4;
>>> linspace(st,ed,num)

ans =

     3     5     7     9
>>> % # additional points to create (other than 3)
>>> p2c=num-1;
>>> % 3 is excluded when calculating distance d.
>>> a=st;
>>> d=ed-st;
>>> % the increment shall calculate without taking the starting value into consideration.
>>> icc=d/p2c;

>>> for idx=[1:p2c];
a(idx+1)=a(idx)+icc;
end;
>>> a

a =

     3     5     7     9

>>> diary off

答案 6 :(得分:0)

如果您想使用Java Streams,一种选择是:

    public static Stream<Double> linspace(double start, double end, int numPoints) {
        return IntStream.range(0, numPoints)
            .boxed()
            .map(i -> start + i * (end - start) / (numPoints - 1));
    }