gpt4 book ai didi

c++ - Arrayfire 稀疏矩阵问题

转载 作者:行者123 更新时间:2023-11-30 05:02:29 30 4
gpt4 key购买 nike

对本应简单的事物感到困惑。花了一些时间尝试调试它,但并没有走得太远。如果有人能帮助我,我将不胜感激。

我正在尝试通过指定此 function 中指定的值/列/行三元组来在 arrayfire 中定义一个稀疏矩阵.我想将以下矩阵存储为稀疏矩阵:

3 3 4 
3 10 0
4 0 3

我把它编码如下:

int row[] = {0,0,0,1,1,2,2};
int col[] = {0,1,2,0,1,0,2};
double values[] = { 3,3, 4,3,10,4,3};
array rr = sparse(3,3,array(7,values),array(7,row),array(7,col));
af_print(rr);
af_print(dense(rr));

我得到以下输出:

rr                                                                      
Storage Format : AF_STORAGE_CSR
[3 3 1 1]
rr: Values
[7 1 1 1]
1.0000
2.0000
4.0000
3.0000
10.0000
4.0000
3.0000

rr: RowIdx
[7 1 1 1]
0
0
0
1
1
2
2

rr: ColIdx
[7 1 1 1]
0
1
2
0
1
0
2

dense(rr)
[3 3 1 1]
0.0000 0.0000 0.0000
0.0000 0.0000 3.0000
3.0000 0.0000 0.0000

当以密集格式打印出存储的矩阵时,我得到的结果与预期完全不同。

如何打印密集版本的 rr 输出:

3 3 4 
3 10 0
4 0 3

最佳答案

Arrayfire 使用(修改)CSR format ,所以 row 数组的长度必须是 number_of_rows + 1。通常它会填充每行非零条目的数量,即 {0, 3 ,2, 2}。但是对于 Arrayfire,您需要取累计和,即 {0, 3, 5, 7}。所以这对我有用:

int row[] = {0,3,5,7};
int col[] = {0,1,2,0,1,0,2};
float values[] = {3,3,4,3,10,4,3};
array rr = sparse(3,3,array(7,values),array(4,row),array(7,col));
af_print(rr);
af_print(dense(rr));

但是,这并不是很方便,因为它与您的输入格式有很大不同。或者,您可以指定 COO format :

int row[] = {0,0,0,1,1,2,2};
int col[] = {0,1,2,0,1,0,2};
float values[] = { 3,3, 4,3,10,4,3};
array rr = sparse(3,3,array(7,values),array(7,row),array(7,col), AF_STORAGE_COO);
af_print(rr);
af_print(dense(rr));

产生:

rr
Storage Format : AF_STORAGE_COO
[3 3 1 1]
rr: Values
[7 1 1 1]
3.0000
3.0000
4.0000
3.0000
10.0000
4.0000
3.0000

rr: RowIdx
[7 1 1 1]
0
0
0
1
1
2
2

rr: ColIdx
[7 1 1 1]
0
1
2
0
1
0
2

dense(rr)
[3 3 1 1]
3.0000 3.0000 4.0000
3.0000 10.0000 0.0000
4.0000 0.0000 3.0000

另见 https://github.com/arrayfire/arrayfire/issues/2134 .

关于c++ - Arrayfire 稀疏矩阵问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49867065/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com