matlab的Java版本';s邻域

matlab的Java版本';s邻域,java,matlab,Java,Matlab,是否有java版本的matlab冒号运算符或linspace?例如,我想为等距数字创建一个For循环,但我不想手动创建这些数字的数组 例如,要获得1到30之间的所有整数,在matlab中,我将键入: 1:30 或 你想这样做吗 for( int number = 1; number <= 30; ++number ) for循环的左侧部分初始化变量,中间部分是在每次迭代之前评估的条件,右侧部分在每次迭代之后执行。对于双变量调用,@x4u是正确的。三变量调用将更难模拟 例如,我认为lin

是否有java版本的matlab冒号运算符或linspace?例如,我想为等距数字创建一个For循环,但我不想手动创建这些数字的数组

例如,要获得1到30之间的所有整数,在matlab中,我将键入:

1:30


你想这样做吗

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

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

对于双变量调用,@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

然后计数器对象的内部应该很容易实现,它将很容易地与您通信它正在做什么,而不会用一堆数字计算来混淆代码以计算比率

实现可能如下所示: (注意:未经测试,我很确定这将很容易受到边缘情况和浮点错误的影响!它也可能无法处理end
公共类Linspace{
私人浮充电流;
私人最终浮动结束;
私人最终浮动步骤;
公共Linspace(浮点开始、浮点结束、浮点总数){
这个。电流=启动;
这个。结束=结束;
this.step=(end-start)/totalCount;
}
公共布尔hasNext(){
返回电流<(结束+步/2);//可能停止浮点错误
}
公共浮点getNextFloat(){
电流+=步进;
回流;
}
}

我认为Bill K的想法是正确的,但我认为没有必要使用Linspace类

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

for(float i = start; i < end; i += (end-start)/totalCount)
    something(i);
//如果在Matlab中编写linspace(开始、结束、totalCount)=>
用于(浮点i=开始;i<结束;i+=(结束-开始)/总计数)
某物(i);

我自己也在寻找这个问题的解决方案,并研究了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;
}
公共静态列表linspace(双启动、双停止、int n)
{
列表结果=新建ArrayList();
双步骤=(停止-启动)/(n-1);

对于(int i=0;i我实际上刚刚为我正在从事的一个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;  
}  
publicstaticdouble[]linspace(doublemin,doublemax,int点){
double[]d=新的双[点];
对于(int i=0;i

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

以下是适用于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

如果您想使用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));
    }
公共静态流linspace(双起点、双终点、整数){
返回IntStream.range(0,numPoints)
.boxed()
.map(i->start+i*(end-start)/(numPoints-1));
}

linspace(a,b)
返回从a到b线性间隔的100个值。它与
a:b
不同,但与
a:((b-a)/99):b
linspace(1,30,30)
1:30
相同。需要注意的一点是,冒号操作符用于生成值的算法已经讨论过了。我没有考虑到浮点数在for循环中可以正常工作这一事实。不过,由于存在浮点数错误,您的条件并不总是正确的,在这和其他问题之间,我宁愿将内容集中。另外,我认为for(float f:Linspace)的代码更干净、更明显(添加类通常有助于可读性)为什么它不能正常工作?如果比较i==end,则浮点舍入错误会导致问题,但如果比较with=则不会,这确实很好。此外,如果要在for-each循环中使用Linspace,则它必须实现Iterable,因此实现起来有点复杂(您还需要实现一个迭代器类,并放置hasNext()和next()最后,它必须是一个IterableOh,而且——编译器实际上会使用您帖子中的当前Linspace代码,拒绝任何试图在Linspace上进行每次迭代的代码,因为它没有正确实现Iterable。如果它应该按正确的按钮(比如end at,50.0)它有一个错误,可能是50.0001或49.9998——这会以某种方式导致一个错误。你可以通过添加或减去少量来修复它,但是每次使用它时你都会复制你的修复。此外,如果你创建一个对象,意图隐藏在这段代码中,它可以变得很明显,而且解决方案更容易阅读——为什么不使用对象?你是对的,它还没有实现iterable--如果你不知道如何实现它,我可以为你实现--我只是想直接添加它。顺便说一下,我不认为“Linspace”是显而易见的,除了使用它的人--我回答的目标。如果是我,我会称它为“iterateOver”或者,如果增加1,
I
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;  
}  
>>> 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
    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));
    }