#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. Супер четкое объяснение! Большое спасибо за ваше время. 🙂