如何计算所有向量元素的sin和cos?

时间:2015-12-10 13:26:37

标签: c++ vector

我的代码

#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <sstream>
#include <cmath>

#define PI 3.14159265

int main(){
    std::ifstream ifs("MFSO7.dat");
    std::string line;

std::vector<float> column1;
std::vector<float> column2;
std::vector<float> column3;
std::vector<float> vkos;
std::vector<float> vsin;

while(std::getline(ifs, line)) // read one line from ifs
{
    std::istringstream iss(line); // access line as a stream
    float item1;
    float item2;
    float item3;

    // Read the items from the line
    iss >> item1 >> item2 >> item3;

    // Add them to the columns.
    column1.push_back(item1);
    column2.push_back(item2);
    column3.push_back(item3);

}

for(int i=0;i<38;i++)
{
vkos[i]=cos(column3[i]* PI/180.0 );
vsin[i]=sin(column3[i]* PI/180.0 );
}

std::cout << vkos[1] << std::endl;

}

我执行我得到的代码

milenko@milenko-X58-USB3:~/Calibration Files$ ./a1
Segmentation fault (core dumped)

为什么?我应该避免循环或......?

5 个答案:

答案 0 :(得分:1)

如果您坚持使用索引迭代到向量中,则可以使用:

for (int i = 0; i < column3.size(); ++i) ...

这样,您至少不会尝试以大于当前数字或元素+ 1的索引进行访问。

否则,您可以尝试将矢量初始化为具有多个值:

std::vector<float> column3(38, 0);

或者,如果您使用的是C ++ 11,您甚至可以选择

for (auto x : column3) ...

答案 1 :(得分:1)

std::valarray就是这样做的,罪恶超载了valarray:

vkos = cos(column3 * PI/180.0);
vsin = sin(column3 * PI/180.0);

不需要循环,这可行。

答案 2 :(得分:0)

vector将有一些容量来保存新项目。这与 size 不同, size vector中实际存在的元素数。因此n的容量并不意味着它已经有n个项目。当一个向量刚刚由默认构造函数 - 没有参数的构造函数构造时,它就没有项目。

i vector::operator[]时,i >= n th 元素通过n是不正确的,其中n是大小;在你的情况下vkos.push_back(cos(value))是0.所以首先你要用push_back创建它们,而不是直接分配给索引。在每个for(auto angle : column3) { vkos.push_back(cos(angle * PI/180.0)); vsin.push_back(sin(angle * PI/180.0)); } if (vkos.size() >= 2) cout << vkos[1] << '\n'; 上,向量的大小增加1。

package helloservice.endpoint;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public class Hello {
    private String message = new String("Hello, ");

    public Hello() {System.out.println("Hello !");}

    /**
     * Web service operation
     */
    @WebMethod(operationName = "operation")
    public String operation() {
        //TODO write your implementation code here:
        return null;
    }

}

答案 3 :(得分:0)

问题是你正在尝试分配你没有的内存。你为什么不用std::transform?使用标准算法有助于避免这些类型的错误,通常比手写循环更好,最重要的是更易于阅读和阅读。了解。另外,请避免使用#define,而不是constexpr

constexpr double Pi {3.14159265};
constexpr auto PiDiv180 = Pi / 180;

std::transform(std::cbegin(column3), std::cend(column3), std::back_inserter(vkos), 
              [PiDiv180] (const auto v) { return std::cos(v * PiDiv180); });
std::transform(std::cbegin(column3), std::cend(column3), std::back_inserter(vsin), 
              [PiDiv180] (const auto v) { return std::sin(v * PiDiv180); });

答案 4 :(得分:0)

这是因为您要分配尚未构建的vkosvsin元素。

最好坚持使用STL来完成这些类型的基于循环的任务,为您解决了很多错误。对于这个特殊问题,您正在寻找std::transform。与您接受的解决方案相比,以下代码具有零开销

std::vector<std::pair<float, float>> vkossin{};
std::transform(
    std::begin(column3), std::end(column3), std::back_inserter(vkossin),
    [](float degs) {
        float rads = degs*PI/180.0;
        return std::make_pair(cos(rads), sin(rads));
    });

std::cout << vkossin[1].first << '\n';

std::back_inserterstd::pairstd::make_pair