【问题标题】:Mean Average vector from 1D vector transposed转置一维向量的平均向量
【发布时间】:2014-02-22 04:53:40
【问题描述】:

这一天大部分时间都让我很烦..

假设我有以下向量:

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,但这也不起作用。

【问题讨论】:

  • 1x4 被转换为2x2???
  • @herohuyongtao 是啊,这是错的吗?看起来不错。因为,4 个值可以表示为 2x2 列。我在这里可能有错误的术语。
  • 那就学什么叫Transpose
  • @herohuyongtao 对不起。那是我的错误。不过,您对我将如何解决我的问题有任何想法吗?
  • 请改用std::vector。这样会更清楚。

标签: c++ vector


【解决方案1】:

你的最后一句话有正确的想法,但不是完全正确的数字。在您提到 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);
}

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

【讨论】:

    【解决方案2】:

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

    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 &lt; size); j++)

    您从 0 开始 j,每次递增 1 到 size()。您点击的大多数值对于您正在尝试执行的操作无效。

    【讨论】:

      【解决方案3】:
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多