首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matlab的linspace的Java版本

matlab的linspace的Java版本
EN

Stack Overflow用户
提问于 2011-06-02 07:26:58
回答 7查看 10.5K关注 0票数 6

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

例如,要获取从1到30的所有整数,在matlab中我会键入:

代码语言:javascript
复制
1:30

代码语言:javascript
复制
linspace(1,30)
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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循环。

代码语言:javascript
复制
counter=new Linspace(1,30,60);
while(counter.hasNext()) {
    process(counter.getNextFloat())
}

或者简单地说

代码语言:javascript
复制
while(float f : new Linspace(1,30,60)) {
    process(f);
}

如果你有你的Linspace对象,实现Iterable。

然后,counter对象的内部应该很容易实现,它会很容易地告诉你它在做什么,而不会用一堆数字计算来混淆你的代码来计算比率。

一个实现可能是这样的:(注意:未测试,我非常确定这将容易受到边缘情况和浮点错误的影响!它也可能不会处理end < start进行反向计数,这只是一个建议,让你继续。)

代码语言:javascript
复制
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;
    }
}
票数 6
EN

Stack Overflow用户

发布于 2011-06-02 07:29:26

你想这样做吗?

代码语言:javascript
复制
for( int number = 1; number <= 30; ++number )

如果你需要它们之间有一个固定的间隔,比如3,你可以这样写:

代码语言:javascript
复制
for( int number = 1; number <= 30; number += 3 )

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

票数 4
EN

Stack Overflow用户

发布于 2013-07-24 01:54:59

实际上,我只是为了我正在从事的一个java项目做这件事。我想确保它是以与MATLAB相同的方式实现的,所以我首先编写了一个MATLAB等效项:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6208878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档