2014-06-09 3 views
5

क्या यह जानना संभव है कि एचडीएफ 5 प्रारूप में संग्रहीत एक मैट्रिक्स RowMajor या ColMajor में है या नहीं? उदाहरण के लिए जब मैं ऑक्टेट से मैट्रिस को सहेजता हूं, जो उन्हें आंतरिक रूप से ColMajor के रूप में संग्रहीत करता है, तो मुझे उन्हें अपने सी कोड में पढ़ने के दौरान उन्हें स्थानांतरित करने की आवश्यकता होती है जहां MatMices RowMajor में संग्रहीत किया जाता है, और इसके विपरीत। पंक्ति प्रमुख क्रम मेंएचडीएफ 5 rowmajor या colmajor

उत्तर

4

HDF5 भंडार डेटा:

HDF5 सी भंडारण सम्मेलनों का उपयोग करता है, यह सोचते हैं कि पिछले सूचीबद्ध आयाम सबसे तेजी से बदल रहा है आयाम और प्रथम सूचीबद्ध आयाम है धीरे बदलते है।

HDF5 User's Guide से।

हालांकि, यदि आप ऑक्टेव के अंतर्निहित एचडीएफ 5 इंटरफ़ेस का उपयोग कर रहे हैं, तो यह स्वचालित रूप से आपके लिए सरणी को स्थानांतरित कर देगा। आम तौर पर, एचडीएफ 5 फाइल में डेटा वास्तव में कैसे लिखा जाता है, अंत उपयोगकर्ता के लिए पूरी तरह से अपारदर्शी होना चाहिए, और इंटरफ़ेस को सरणी क्रम में अंतरों से निपटना चाहिए, आदि

+0

तो जब मैंने ऑक्टेट से निर्यात किए गए डेटा को पढ़ा और उन्हें ट्रांसफर किया गया तो यह इस तथ्य के कारण है कि ऑक्टेव एचडीएफ 5 सम्मेलनों का पालन नहीं करता है, है ना? – remi

+0

इसे पढ़ने के लिए आप क्या उपयोग कर रहे हैं? – Yossarian

+0

मैं अपने द्वारा लिखित सी ++ में एक कोड का उपयोग कर रहा हूं। मैंने बस डेटासेट आयाम पढ़ा है और फिर मानों को पढ़ा है। – remi

4

@Yossarian ने बताया। एचडीएफ 5 हमेशा डेटा को पंक्ति-प्रमुख (सी सम्मेलन) के रूप में संग्रहीत करता है। ऑक्टवे फोर्ट्रान के समान है और आंतरिक रूप से कॉलम-प्रमुख के रूप में डेटा स्टोर करता है।

ऑक्टेव से मैट्रिक्स लिखते समय, एचडीएफ 5 परत आपके लिए स्थानांतरित करती है, इसलिए इसे हमेशा पंक्ति-प्रमुख के रूप में लिखा जाता है चाहे आप किस भाषा का उपयोग करें। यह फ़ाइल की पोर्टेबिलिटी प्रदान करता है।

@Yossarian द्वारा उल्लिखित एचडीएफ 5 उपयोगकर्ता के गाइड अनुभाग 7.3.2.5 में एक बहुत अच्छा उदाहरण है। यहाँ उदाहरण है (लगभग) सप्टक का उपयोग कर reproduced:

octave:1> A = [ 1:3; 4:6 ] 
A = 

    1 2 3 
    4 5 6 

octave:2> save("-hdf5", "test.h5", "A") 
octave:3> quit 

~$ h5dump test.h5 
HDF5 "test.h5" { 
GROUP "/" { 
    COMMENT "# Created by Octave 3.6.4, Fri Jun 13 08:36:16 2014 MDT <[email protected]>" 
    GROUP "A" { 
     ATTRIBUTE "OCTAVE_NEW_FORMAT" { 
     DATATYPE H5T_STD_U8LE 
     DATASPACE SCALAR 
     DATA { 
     (0): 1 
     } 
     } 
     DATASET "type" { 
     DATATYPE H5T_STRING { 
      STRSIZE 7; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
     DATASPACE SCALAR 
     DATA { 
     (0): "matrix" 
     } 
     } 
     DATASET "value" { 
     DATATYPE H5T_IEEE_F64LE 
     DATASPACE SIMPLE { (3, 2)/(3, 2) } 
     DATA { 
     (0,0): 1, 4, 
     (1,0): 2, 5, 
     (2,0): 3, 6 
     } 
     } 
    } 
} 
} 

सूचना कैसे HDF5 परत मैट्रिक्स स्थानांतरित किया है यकीन है कि यह पंक्ति-प्रमुख प्रारूप में संग्रहीत किया जाता है बनाने के लिए।

फिर सी में इसे पढ़ने का एक उदाहरण:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <hdf5.h> 

#define FILE "test.h5" 
#define DS "A/value" 

int 
main(int argc, char **argv) 
{ 
     int i = 0; 
     int j = 0; 
     int n = 0; 
     int x = 0; 
     int rank = 0; 
     hid_t file_id; 
     hid_t space_id; 
     hid_t dset_id; 
     herr_t stat; 
     hsize_t *dims = NULL; 
     int *data = NULL; 

     file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); 
     dset_id = H5Dopen(file_id, DS, dset_id); 

     space_id = H5Dget_space(dset_id); 
     n = H5Sget_simple_extent_npoints(space_id); 
     rank = H5Sget_simple_extent_ndims(space_id); 

     dims = malloc(rank*sizeof(int)); 
     stat = H5Sget_simple_extent_dims(space_id, dims, NULL); 

     printf("rank: %d\t dimensions: ", rank); 
     for (i = 0; i < rank; ++i) { 
       if (i == 0) { 
         printf("("); 
       } 
       printf("%llu", dims[i]); 
       if (i == (rank -1)) { 
         printf(")\n"); 
       } else { 
         printf(" x "); 
       } 
     } 
     data = malloc(n*sizeof(int)); 
     memset(data, 0, n*sizeof(int)); 
     stat = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, 
         data); 


     printf("%s:\n", DS); 
     for (i = 0; i < dims[0]; ++i) { 
       printf(" [ "); 
       for (j = 0; j < dims[1]; ++j) { 
         x = i * dims[1] + j; 
         printf("%d ", data[x]); 
       } 
       printf("]\n"); 
     } 

     stat = H5Sclose(space_id); 
     stat = H5Dclose(dset_id); 
     stat = H5Fclose(file_id); 


     return(EXIT_SUCCESS); 
} 

जब संकलित करने और चलाने देता है:

~$ h5cc -o rmat rmat.c 
~$ ./rmat 
rank: 2 dimensions: (3 x 2) 
A/value: 
[ 1 4 ] 
[ 2 5 ] 
[ 3 6 ] 

यह महान के रूप में यह मतलब है मैट्रिक्स स्मृति में अनुकूलित भंडारित हो जाता है। इसका मतलब यह है कि यद्यपि आपको यह बदलना है कि आप अपनी गणना कैसे करते हैं। पंक्ति-प्रमुख के लिए आपको पूर्व-गुणा करने की आवश्यकता है, जबकि स्तंभ-प्रमुख के लिए आपको पोस्ट-गुणा करना चाहिए। यहां एक example है, उम्मीद है कि यह थोड़ा स्पष्ट समझाया गया है।

क्या इससे मदद मिलती है?

+0

Thx।लेकिन आपके उदाहरण के आधार पर, एचडीएफ 5 रोमोजर में मैट्रिक्स को स्टोर नहीं करता है: कोल्मोजर में ऑक्टेव मेमोरी में मैट्रिक्स 'ए', 1 डी वेक्टर के रूप में दिखाई देगा, जिसमें मूल्य '{1,4,2,5,3,6 } '। इसके अलावा, मंद [0] = 2 और dim1 [1] = 3। जब आप सी प्रोग में ए पढ़ते हैं, तो मैट्रिक्स पढ़ने में मिश्रित आयाम होते हैं, और रोमोजर, 1 डी मेमोरी पढ़ने के समतुल्य समतुल्य मैट्रिक्स भी {1,4,2,5,3,6} है। मुझे उम्मीद है कि '{1,2,3,4,5,6}'। कम से कम, मैं एचडीएफ 5 फाइल में कुछ संकेतों की अपेक्षा करता हूं कि मैट्रिक्स कॉफ़ के लिए मेमोरी लेआउट लिखते समय पंक्ति या कॉल प्रमुख को अच्छी तरह से पढ़ने के लिए। – remi

संबंधित मुद्दे