这一天大部分时间都让我烦恼。
假设我有以下向量:
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,但这也不起作用。
答案 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;
}