2

シンプルであるべきものと混同する。これをデバッグするのに少し時間を費やしましたが、あまり進んでいません。誰かが私を助けてくれれば幸いです。

この関数で指定されている値/列/行のトリプルを指定して、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
4

1 に答える 1

2

Arrayfire は (変更された) CSR 形式を使用するため、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 形式を指定することもできます。

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も参照してください。

于 2018-04-23T10:44:51.777 に答える