2014-02-21 7 views
0

Это было раздражает меня в течение всего дня ..Среднее Среднее вектор из 1D вектор транспонировать

Предположим, что у меня есть следующий вектор:

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; 
    } 

Который производит:

У меня, вероятно, отсутствует что-то действительно глупое, но я не могу понять, что т.

Я также пытался иметь переменную subRow, которая начинается с 0 и увеличивается каждый раз на 3, но это тоже не сработало.

+0

'1x4' был перенесен на' 2x2' ??? – herohuyongtao

+0

@herohuyongtao Да, это неправильно? Это выглядит правильно. Так как 4 значения могут быть представлены как 2x2 столбца. Возможно, у меня могут быть неправильные термины. – Phorce

+0

Затем узнайте, что называется [* Transpose *] (http://en.wikipedia.org/wiki/Transpose). – herohuyongtao

ответ

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); 
} 

По крайней мере, на данный момент, это происходит само собой разумеющееся, что размер входной матрицы на самом деле является «правильным» --ie, кратен шаг, который вы указываете.

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++)

Вы начинаете j на 0 и приращение от 1 до size() каждого время. Большинство значений, которые вы нажимаете, не будут действительны для того, что вы пытаетесь сделать.

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; 
} 
Смежные вопросы