首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arrayfire稀疏矩阵问题

Arrayfire稀疏矩阵问题
EN

Stack Overflow用户
提问于 2018-04-16 22:18:49
回答 1查看 257关注 0票数 2

被一些应该简单的东西弄糊涂了。花了一些时间来调试这一点,而且没有做得太远。如果有人能帮我的话。

我试图通过指定这个函数中指定的值/列/行三元组来定义arrayfire中的稀疏矩阵。我想将以下矩阵存储为稀疏矩阵:

代码语言:javascript
复制
3 3 4 
3 10 0 
4 0 3

我将其编码如下:

代码语言:javascript
复制
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));

我得到以下输出:

代码语言:javascript
复制
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的密集版本:

代码语言:javascript
复制
3 3 4 
3 10 0 
4 0 3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-23 10:44:51

Arrayfire使用(修改后的) CSR格式,因此row数组必须长度为number_of_rows + 1。通常情况下,它将用每行非零项的数目来填充,即{0, 3 ,2, 2}。但是对于Arrayfire,您需要计算累积和,即{0, 3, 5, 7}。所以这对我来说很管用:

代码语言:javascript
复制
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格式

代码语言:javascript
复制
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));

它产生:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49867065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档