是否有java版本的matlab冒号运算符或linspace?例如,我想为均匀分布的数字创建一个For循环,但我不想费心手动创建这些数字的数组。
例如,要获取从1到30的所有整数,在matlab中我会键入:
1:30或
linspace(1,30)发布于 2011-06-02 07:53:17
对于两个变量的调用,@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。
然后,counter对象的内部应该很容易实现,它会很容易地告诉你它在做什么,而不会用一堆数字计算来混淆你的代码来计算比率。
一个实现可能是这样的:(注意:未测试,我非常确定这将容易受到边缘情况和浮点错误的影响!它也可能不会处理end < start进行反向计数,这只是一个建议,让你继续。)
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;
}
}发布于 2011-06-02 07:29:26
你想这样做吗?
for( int number = 1; number <= 30; ++number )如果你需要它们之间有一个固定的间隔,比如3,你可以这样写:
for( int number = 1; number <= 30; number += 3 )for循环的左边部分初始化变量,中间部分是在每次迭代之前计算的条件,右边部分在每次迭代之后执行。
发布于 2013-07-24 01:54:59
实际上,我只是为了我正在从事的一个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;
} 在我看来,这比为这个函数创建一个新类简单得多。
https://stackoverflow.com/questions/6208878
复制相似问题