экспортировать переменную matlab в текст для использования на python - PullRequest
3 голосов
/ 19 августа 2011

Итак, начнем с того, что я абсолютный новичок в матлабе. Я работаю с Python, и теперь я получил некоторые данные в файле Matlab, которые мне нужно экспортировать в формат, который я мог бы использовать с Python.

Я гуглил и обнаружил, что могу экспортировать переменную matlab в текстовый файл, используя:

dlmwrite('my_text', MyVariable, 'delimiter' , ',');

Теперь переменная, которую мне нужно экспортировать, представляет собой матрицу двойного типа 16000 x 4000 в форме 0.006747668446927. Теперь вот где начинается проблема. Мне нужно экспортировать полные значения для каждого двойника. Попытка использовать эту функцию привела меня к экспорту чисел в формате 0.0067477. Это не сработает, так как мне нужно гораздо больше точности в том, что я делаю. Итак, как я могу экспортировать полные значения каждой из этих переменных? Или, если у вас есть более элегантный способ использовать эту огромную матрицу Matlab в Python, пожалуйста, не стесняйтесь.

С уважением, Богдан

Ответы [ 4 ]

6 голосов
/ 19 августа 2011

Для обмена большими кусками числовых данных между Python и Matlab I рекомендую HDF5

Привязка Python называется h5py

Вот два примера для обоих направлений. Первый из Matlab to Python

% matlab
points = [1 2 3 ; 4 5 6 ; 7 8 9 ; 10 11 12 ];
hdf5write('test.h5', '/Points', points);

# python
import h5py
with h5py.File('test.h5', 'r') as f:
    points = f['/Points'].value    

А теперь из Python в Matlab

# python
import h5py
import numpy
points = numpy.array([ [1., 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ])
with h5py.File('test.h5', 'w') as f:
    f['/Points'] = points

% matlab
points = hdf5read('test.h5', '/Points');

ПРИМЕЧАНИЕ Столбец в Matlab будет выглядеть как строка в Python, и наоборот. Это не ошибка, но разница между тем, как C и Fortran интерпретируют непрерывный фрагмент данных в памяти.

0 голосов
/ 20 августа 2011

Вы можете просто записать свою переменную в файл как двоичные данные, а затем прочитать ее на любом языке, который вы хотите, будь то MATLAB, Python, C и т. Д. Пример:

MATLAB (запись)

X = rand([100 1],'single');

fid = fopen('file.bin', 'wb');
count = fwrite(fid, X, 'single');
fclose(fid);

MATLAB (чтение)

fid = fopen('file.bin', 'rb');
data = fread(fid, Inf, 'single=>single');
fclose(fid);

Python (чтение)

import struct

data = []
f = open("file.bin", "rb")
try:
    # read 4 bytes at a time (float)
    bytes = f.read(4)           # returns a sequence of bytes as a string
    while bytes != "":
        # string byte-sequence to float
        num = struct.unpack('f',bytes)[0]

        # append to list
        data.append(num);

        # read next 4 bytes
        bytes = f.read(4)
finally:
    f.close()

# print list
print data

C (чтение)

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

int main()
{
    FILE *fp = fopen("file.bin", "rb");

    // Determine size of file
    fseek(fp, 0, SEEK_END);
    long int lsize = ftell(fp);
    rewind(fp);

    // Allocate memory, and read file
    float *numbers = (float*) malloc(lsize);
    size_t count = fread(numbers, 1, lsize, fp);
    fclose(fp);

    // print data
    int i;
    int numFloats = lsize / sizeof(float);
    for (i=0; i<numFloats; i+=1) {
        printf("%g\n", numbers[i]);
    }

    return 0;
}
0 голосов
/ 19 августа 2011

Хотя мне нравится ответ на основе hdf5, я все же считаю, что текстовые файлы и файлы CSV хороши для небольших задач (их можно открывать в текстовых редакторах, электронных таблицах и т.д.).В этом случае я бы использовал MATLABs fopen / fprintf / fclose вместо dlmwrite - я хотел бы сделать вещи явными.Опять же, этот dlmwrite может быть лучше для многомерных массивов.

0 голосов
/ 19 августа 2011

У Scipy есть инструменты для чтения файлов MATLAB .mat: см., Например, http://www.janeriksolem.net/2009/05/reading-and-writing-mat-files-with.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...