是否有matlab的冒号运算符或linspace的java版本?例如,我想为均匀间隔的数字创建一个for循环,但我不想打扰手动创建这些数字的数组。
例如,为了得到1到30之间的所有整数,在matlab中我会输入:
1:30
或
linspace(1,30)
答案 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));
}