0

我正在使用cblas_icamax. 我想将一个浮点向量传递z13]给 cblas_icamax(见下文)。我的代码包括以下内容。

    float z[13] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f ,0.f, 0.f, 0.f, 0.f, 0.f};
//...

    for (i = 0; i < 13; i++) {
        printf("%.4f\n", z[i]);
    }
    int cardIndex = cblas_icamax(13,(float*) z,1);
    NSLog(@"cardIndex: %d", cardIndex);

我也尝试了这段代码,结果相同。

int cardIndex = cblas_icamax(13,&z,1);

打印结果如下,最大绝对值为 138.1086,即位置 10,但函数cblas_icamax返回 5。出了什么问题?

-1.2624
74.1524
52.3533
89.9426
28.8639
-7.6203
-30.2820
48.9747
124.8693
29.4351
138.1086
36.2638
-45.0410

cblas_icamax

返回向量中绝对值最大的元素的索引(单精度复数)。

int cblas_icamax (
   const int N,
   const void *X,
   const int incX
);
4

2 回答 2

2

floats您的阵列中有 13 个。

您向库保证您float complex的数组中有 13 个值(即 26 floats)。行为不符合预期也就不足为奇了。要么将复杂数据数组作为输入传递,要么使用cblas_isamax

为了更准确地解释正在发生的事情:cblas_icamax返回具有最大 L1 范数的复数浮点数的索引。每个复数浮点数是来自输入的一对浮点值。如果我们查看您输入的 L1 规范:

index        value            L1 norm
0      -1.2624 + 74.1524i     75.4148
1      52.3533 + 89.9426i    142.2959
2      28.8639 -  7.6203i     36.4842
3     -30.2820 + 48.9747i     79.2567
4     124.8693 + 29.4351i    154.3044
5     138.1086 + 36.2638i    174.3724
6     -45.0410 + ???i           ???
7          ??? + ???i           ???
8          ??? + ???i           ???
9          ??? + ???i           ???
10         ??? + ???i           ???
11         ??? + ???i           ???
12         ??? + ???i           ???

这 '???' 字段表示未初始化的数据。所以cblas_icamax返回的结果当然看起来是合理的;在初始化的字段中,它具有最大的 L1 范数。当然,实际行为是未定义的,因为您告诉函数从未初始化(并且可能未映射)的内存中读取。

于 2013-01-29T21:13:30.763 回答
1

我应该调用 cblas_isamax,而不是 cblas_icamax,因为我的数组不是复数。

于 2013-01-29T21:05:18.823 回答