我正在尝试使用英特尔MKL库中的 cblas_idamax 函数来获取输入矩阵的每列的最大值。在某些执行中,我得到正确答案,但在其他情况下,我得到错误的索引。这是我的C代码的一个例子:
const MKL_INT nByRow = 2;
const MKL_INT matrix_size = nByRow*nByRow
double * colMaxs = (double *)mkl_malloc(sizeof(double)*nByRow, 64);
double * matrix = (double *)mkl_malloc(sizeof(double)*nByRow, 64);
// matrix is CblasRowMajor
// 1 2
// 3 4
matrix[0]=1;
matrix[1]=2;
matrix[2]=3;
matrix[3]=4;
for(size_t i=0;i<nByRow;i++){
// calculate the index of the max value in each column
maxPos = cblas_idamax(matrix_size, matrix + i , nByRow);
// save the max value
colMaxs[i] = (*matrix)[i + (maxPos * nByRow)];
}
有时 cblas_idamax 会为每列返回索引1,这是正确的,但其他时间为每列返回3。我认为这是一个与记忆有关的问题。如果有人对这里发生的事情有一些线索,我将非常感激:)
我的电脑是2015年初的MacBook Pro Retina
操作系统:Sierra处理器:Intel 2.7 GHz Intel Core i5
提前致谢!
答案 0 :(得分:0)
maxPos
是“向量”中的绝对位置,而不是行索引。而且似乎你有太多的间接性。
获取你应该做的元素值
// save the max value
colMaxs[i] = matrix[i + maxPos];
要获取行索引,您需要计算(maxPos-i)/nByRow
左右。