转换1D载体的平均平均载体

时间:2014-02-21 20:34:03

标签: c++ vector

这一天大部分时间都让我烦恼。

假设我有以下向量:

v = [1, 2, 4, 9]

我转置了这个,所以向量在列中:

v = [1, 2
    4, 9]

我这样做,使用以下方法:

for(unsigned i=0; (i < cols); i++)
{
    for(unsigned j=0; (j < 2); j++)
    {
         std::cout << vect[i*2+j] << " ";
    }
    std::cout << std::endl;
}

但是我怎么先计算列?我的目标是实现以下目标:

(1 + 4)/2 = 2.5
(2 + 9)/2 = 5.5

因此,结果向量将返回均值矩阵:x = [2.5, 5.5]

我尝试了以下内容:

double summation = 0;

for(unsigned i=0; (i < cols); i++)
    {
        for(unsigned j=0; (j < size); j++)
        {
            summation += values[i*(i*j)+j];
        }
        std::cout << summation << std::endl;
    }

哪个产生: 3 8

我可能在这里遗漏了一些非常愚蠢的东西,但是,我似乎无法弄清楚是什么。

我还尝试过一个变量subRow,从0开始,每次增加3,但这也不起作用。

3 个答案:

答案 0 :(得分:2)

你的最后一句话有正确的想法,但不是正确的数字。如果你提到3,你似乎需要2.这通常被称为“步幅”。使用它,按列平均会出现如下:

for (int i=0; i<stride; i++) {
    double total = 0;
    for (int j=0; j<input.size(); j+=stride)
        total += input[j];
    result[i] = total / (j.size()/stride);
}

至少目前,这是理所当然的,输入矩阵的大小确实是“正确的” - 即,你指定的步幅的偶数倍。

答案 1 :(得分:0)

如果保持索引计算简单,您可能会发现调试更容易:

std::vector<int> v{1, 2, 4, 9};
const unsigned int WIDTH = 2;
for (unsigned int i = 0; i < WIDTH; ++i)
{
    double sum = 0.0;
    for (unsigned int j = i; j < v.size(); j += WIDTH)
    {
        sum += v[j];
    }
    // do something with sum
}

您的问题似乎在此处:for(unsigned j=0; (j < size); j++)

您从0开始j,每次增加1到size()。您点击的大多数值对您要执行的操作无效。

答案 2 :(得分:0)

int v[] = {1,2,4,9};
int cols = 2;
int rows = 2;
for(int c=0 ; c < cols ; c++) {
    double sum=0;
    for(int r=0 ; r < rows ; r++)
        sum += v[cols*r+c];
    std::cout << sum /rows << std::endl;
}