Arrayfire稀疏矩阵问题

时间:2018-04-16 22:18:49

标签: c++ arrayfire

对应该简单的事情感到困惑。花了一点时间试图调试这个并没有走得太远。如果有人可以帮助我,我将不胜感激。

我试图通过指定此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

1 个答案:

答案 0 :(得分:1)

Arrayfire使用(已修改的)CSR format,因此number_of_rows + 1数组的长度必须为{0, 3 ,2, 2}。通常,它将填充每行非零条目的数量,即{0, 3, 5, 7}。但对于Arrayfire,您需要获取累积总和,即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)); 。所以这对我有用:

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));

然而,这并不是很方便,因为它与您的输入格式完全不同。您也可以指定COO format

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 

产生:

<input type='text' name='profileUsername' value='<?php echo $username; ?>' hidden>
<video width="320" height="240" id='video' controls>
   <source src="videos/<?php echo $row['video'] ?>" type="video/mp4">
    Your browser does not support the video tag.
</video>

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