подход для сохранения и загрузки 3D-матрицы

#matlab #matrix #file-io #text-files

#matlab #матрица #file-io #текстовые файлы

Вопрос:

Мне нужно сохранить 3D-матрицу в текстовом файле, который будет загружен в Matlab (который я не осваиваю). Моей первой идеей было сделать это с помощью .csv, подобного этому (рассмотрим матрицу 3x3x3):

         row 1: v[0][0][0],v[0][0][1] ,v[0][0][2]
        row 2: v[0][1][0],v[0][1][1] ,v[0][1][2]
        row 3: v[0][2][0],v[0][2][1] ,v[0][2][2]
        row4: v[1][0][0],v[1][0][1] ,v[1][0][2] 
        ...
  

Таким образом, я должен отдельно информировать пользователя о количестве измерений x и y. Не слишком чистый, но и не большая драма.

Мой вопрос в том, как я мог бы загрузить и отобразить в Matlab такой набор данных, как этот? Значения равны 1/0.

Есть ли какой-нибудь более разумный способ сделать это. Я экспортирую из Java.

Спасибо!

Комментарии:

1. dlmread считывает 2D-массив. reshape можно преобразовать его в 3D. Если вы написали это в правильном порядке, это операция в 1 строку.

2. Просто используйте save и load . save имеет режим, в котором при необходимости сохраняется в текстовом формате, но двоичный формат по умолчанию более эффективен.

Ответ №1:

Я не могу придумать способ, которым вы можете отказаться от сохранения размеров матрицы (по крайней мере, два из них должны быть упомянуты). Но когда дело доходит до хранения значений в файле, я предлагаю вам даже не утруждать себя записью их в табличном формате. Все, что вам нужно знать о MATLAB, — это порядок элементов в матрице. Взгляните на этот пример:

 %% create a 3d matrix
% a = 1 randi(5);
% b = 1 randi(5);
% c = 1 randi(5);
a = 2; b = 3; c = 4;
M = reshape(1:a*b*c, a, b, c)
  

Вот как выглядит матрица:

M(:,:,1) =

  1     3     5
 2     4     6
  

M(:,:,2) =

  7     9    11
 8    10    12
  

M(:,:,3) =

 13    15    17
14    16    18
  

M(:,:,4) =

 19    21    23
20    22    24
  

Теперь давайте запишем это в текстовый файл:

 %% writing matrix in the text file,
%  translate it to your target language
fid = fopen('matrix.txt', 'w');
fprintf(fid, '%d,%d,%dn', a, b, c);
for k=1:c
    for j=1:b
        for i=1:a
            fprintf(fid, '%-.8gn', M(i, j, k));
        end
    end
end
fclose(fid);
  

Это содержимое файла:

2,3,4
1
2
3
4

21
22
23
24

Теперь, чтобы прочитать файл:

 %% read the file back in MATLAB
fid = fopen('matrix.txt', 'r');
sz = str2num(fscanf(fid, '%sn', 1)); % read dimensions
M2 = reshape(fscanf(fid, '%fn', inf), sz); % read values
fclose(fid);

%% test the imported matrix
disp(sz)
if all(all(all(M == M2)))
    disp('OK')
else
    disp('Test failed.')
end
  

Комментарии:

1. Вам не нужен цикл, fprintf(fid, '%-.8gn', M) будет делать то же самое.

2. @CrisLuengo Уверен, что это так, но я подумал, что OP необходимо реализовать эту часть на другом языке, и они сказали, что они не так хорошо знакомы с matlab.

3. Супер четкое объяснение! Большое спасибо за ваше время. 🙂