Матлаб не видит функцию в отдельном файле

Обновлено: 07.07.2024

[Matlab] Операции с файлами в Matlab: fopen, fseek, fread, fclose и т. Д.

Работа с файлами - важный метод ввода и вывода, то есть чтение данных из файлов данных или запись результатов в файлы данных. MATLAB предоставляет ряд низкоуровневых функций ввода и вывода специально для файловых операций.

1. Открытие и закрытие файла

1) Откройте файл
Перед чтением и записью файла необходимо использовать функцию fopen, чтобы открыть или создать файл, и указать режим работы для файла. Формат вызова функции fopen:
fid = fopen (имя файла, «открытый метод»)
Примечание: fid используется для хранения значения дескриптора файла. Если возвращаемое значение дескриптора больше 0, файл открывается успешно. В имени файла используется строка символов, чтобы указать файл данных, который нужно открыть. Распространенные способы открытия следующие:
 ‘r’: откройте файл в режиме только для чтения (режим по умолчанию), файл должен уже существовать.
 ‘r +’: откройте файл в режиме чтения-записи, после открытия сначала прочтите, а затем запишите. Файл должен уже существовать.
 ‘w’: записывать данные после открытия. Файл обновляется, если он уже существует; если он не существует, он создается.
 ‘w +’: откройте файл в режиме чтения-записи. Сначала читайте, потом пишите. Файл обновляется, если он уже существует; если он не существует, он создается.
 ‘a’: добавить данные в конец открытого файла. Если файл не существует, он создается.
 ‘a +’: после открытия файла сначала считайте данные, а затем добавьте данные. Если файл не существует, он создается.
Кроме того, добавьте "t" после этих строк, например,'rt 'или'wt +', тогда файл будет открыт в текстовом режиме; если добавлен "b", то Открыть в двоичном формате, который также является методом открытия по умолчанию для функции fopen.

2) Закройте файл
Файл должен быть закрыт вовремя после операций чтения и записи, чтобы избежать потери данных. Используйте функцию fclose, чтобы закрыть файл. Формат вызова:
sta=fclose(fid)
Описание: эта функция закрывает файл, представленный fid. sta представляет собой код возврата операции закрытия файла. Если закрытие прошло успешно, возвращается 0, в противном случае - -1. Если вы хотите закрыть все открытые файлы, используйте fclose («все»).

2. Операции чтения и записи двоичных файлов.

1) Записывать двоичные файлы
Функция fwrite записывает элементы матрицы в файл в соответствии с указанной точностью данных. Формат звонка:
COUNT=fwrite(fid,A,precision)
Описание: COUNT возвращает количество записанных элементов данных (по умолчанию), fid - дескриптор файла, A используется для хранения данных, записанных в файл, precision представляет точность данных, обычно используется Точность данных включает: char, uchar, int, long, float, double и т. Д. По умолчанию точность данных равна uchar, то есть беззнаковому формату символов.
Пример 6.8 Сохранение двоичной матрицы в файл на диске.

a=[1 2 3 4 5 6 7 8 9];
fid = fopen (‘d: \ test.bin’, ‘wb’)% Откройте файл, записав двоичные данные
fid =
3%, значение которого больше 0, что означает успешное открытие

fwrite(fid,a,‘double’)
ans =
9% означает, что записано 9 данных.

fclose(fid)
ans =
0% означает, что выключение прошло успешно.

2) Читать двоичные файлы
Функция fread может считывать данные двоичного файла и сохранять их в матрице. Формат звонка:
[A,COUNT]=fread(fid,size,precision)
Описание: где A - матрица, используемая для хранения считанных данных, COUNT - количество возвращенных элементов данных, fid - дескриптор файла, а размер является необязательным. Если не выбран, Прочитать все содержимое файла; если этот параметр выбран, его значение может быть следующими: N (читать N элементов в вектор-столбец), inf (читать весь файл), [M, N] (читать данные в M × N Данные хранятся в столбцах). Precision используется для контроля точности записываемых данных, и его форма такая же, как у функции fwrite.

3. Операции чтения и записи текстовых файлов.
1) Прочитать текстовый файл
Функция fscanf может считывать содержимое текстового файла и сохранять его в матрице в соответствии с указанным форматом. Формат звонка:
[A,COUNT]=fscanf(fid,format,size)
Описание: A используется для хранения считанных данных, COUNT возвращает количество прочитанных элементов данных, fid - это дескриптор файла, формат используется для управления форматом считанных данных и% В сочетании с символами формата распространенными символами формата являются: d (целое число), f (с плавающей точкой), s (строка), c (символ) и т. Д. Вы также можете вставить дополнительные символы между% и символами формата. Спецификатор формата, например описание ширины данных. Размер не является обязательным, он определяет порядок данных в матрице A. Он может принимать следующие значения: N (чтение N элементов в вектор-столбец), inf (чтение всего файла), [M, N] (чтение данных в В матрице M × N данные хранятся в столбцах).

Использование fscanf в Matlab выглядит следующим образом:
A=fscanf(fid,format)
[A, count]=fscanf(fid,format,size)
[A, count]=fscanf(fid,format,size)

Лично наиболее часто используемая форма такова:
data = fscanf(fid,format,size);
, где данные - это массив прочитанного содержимого, а его размер определяется размером. size - вектор [mn], m - строка, n - столбец (обратите внимание, что здесь порядок чтения - сначала столбец, если вы не понимаете, вы можете увидеть пример ниже), если n - inf, это означает чтение до конца файла. . fid - это возвращаемое значение файла, открытого fopen, а format - это параметр форматирования (например, printf, scanf).

Приведи небольшой пример:
Путь + имя файла: d: \ moon.txt
Содержание: 13,1,3.4

Теперь, чтобы прочитать данные из moon.txt в массиве, вы можете использовать следующий метод:
fid=fopen(‘d:\moon.txt’);
data = fscanf (fid, ’% f,% f,% f’, [3, inf]);% используйте здесь одинарные кавычки
fclose(fid);

На данный момент данные в данных выглядят следующим образом: (3 строки и 4 столбца, элементы MATLAB расположены в порядке столбцов)

Обычно нам может потребоваться ссылка на определенную строку или определенный столбец в массиве, чтобы нарисовать изображение, метод - данные (m, :) или данные (:, n), то есть получить m-ю строку или n-й столбец массива данных.

2) Напишите текстовый файл
Функция fprintf может записывать данные в текстовый файл в указанном формате. Формат звонка:
fprintf(fid,format,A)
Описание: fid - это дескриптор файла, который указывает файл, в который будет выполняться запись. format - это символ формата, используемый для управления форматом записываемых данных, который аналогичен функции fscanf. A используется для хранения данных. матрица.
Пример 6.9. Создайте символьную матрицу и сохраните ее на диск, затем считайте и назначьте другой матрице.

matlab читает текстовый файл
fid=fopen(‘fx.txt’,‘r’);
% получить номер файла
[f,count]=fscanf(fid,’%f %f’,[12,90]);
% Прочитать данные файла номер 1 в f. Где f - матрица [12 90]
% Здесь ’% f% f’ представляет формат чтения данных, которые считываются как исходный тип данных.
fclose(fid);
% Закрыть файл

Кроме того, некоторые файлы txt можно открывать с помощью load
Предложение
f=load('fx.txt)
Я лично считаю, что первый способ лучше. Потому что иногда, особенно когда в одной строке fx.txt содержится несколько данных, использование load более проблематично.

4. Расположение файла данных
MATLAB предоставляет функции fseek и ftell, связанные с операциями позиционирования файлов. Функция fseek используется для определения местоположения указателя позиции файла, и ее формат вызова:
status=fseek(fid, offset, origin)
, где fid - дескриптор файла, смещение представляет количество байтов, перемещаемых указателем позиции, а значения OFFSET интерпретируются следующим образом:

0 Move toward the end of the file.
= 0 Do not change position.
< 0 Move toward the beginning of the file.
origin представляет исходную позицию перемещения указателя позиции, значения ORIGIN интерпретируются следующим образом:
‘bof’ or -1 Beginning of file
‘cof’ or 0 Current position in file
‘eof’ or 1 End of file。
Если позиционирование выполнено успешно, возвращаемое значение статуса - 0, в противном случае возвращаемое значение - –1.

Функция ftell возвращает текущую позицию указателя файла, и ее формат вызова:
position=ftell (fid)
Возвращаемое значение - это количество байтов от начала файла до текущей позиции указателя. Если возвращаемое значение равно –1, это означает, что текущая позиция файла не может быть получена.
Пример:
FID=fopen(‘sw.m’,‘r’)
fseek(FID,10,-1)
ans =
0

ftell(FID)
ans =
2180
Указатель файла можно переместить за конец текущего файла, но не перед его началом; когда указатель перемещается за конец файла, если файл закрыт, размер файла автоматически увеличивается до размера файла. Размер, указанный указателем, позволяет легко создать большой файл с помощью этого метода, конечно, содержимое нового добавленного файла является случайным.

[Приложение: Matlab читает исходный код файлов формата grd]
clc;
clear all;
close all;
fid=fopen([‘C:\Zhenghui_Code\testDLL\testForDLL\kms04ssh-egm96u.grd’],‘r’);

head = fread (fid, 4, ‘uint8 => char’) ’;% Прочтите заголовок файла DSAA
fscanf(fid,’\n’);

nx = fscanf (fid, ’% d’, 1);% прочитано количество строк данных сетки nnx, количество столбцов nnz
fp = fseek (fid, 1,0);% 1 означает, что указатель прочитанного файла сдвигается назад на 1 бит, а 0 означает, что указатель перемещается относительно текущей позиции
ny=fscanf(fid,’%d’,1);
fscanf(fid,’\n’);

xmin = fscanf (fid, ’% f’, 1);% считывает минимальное и максимальное значения x
fseek (fid, 4,1);% 4 означает, что указатель прочитанного файла сдвинут назад на 4 бита, 1 означает, что ссылочная позиция перемещения указателя является концом файла
xmax=fscanf(fid,’%f’,1);
fscanf(fid,’\n’);

ymin = fscanf (fid, ’% f’, 1);% считывает минимальное и максимальное значения y
fseek(fid,4,1);
ymax=fscanf(fid,’%f’,1);
fscanf(fid,’\n’);

zmin = fscanf (fid, ’% f’, 1);% считывает минимальное и максимальное значения z
fseek(fid,4,1);
zmax=fscanf(fid,’%f’,1);
fscanf(fid,’\n’);

for i = 1: ny% Обратите внимание, что Matlab хранит данные в порядке столбцов, сначала столбец 1, затем столбец 2, а затем последний столбец.
for m=1:nx
vp(i,m)=fscanf(fid,’%f’,1);
fseek(fid,4,1);
end
fscanf(fid,’\n’);
end

иногда удобно использовать функцию в качестве" постоянной " переменной в MATLAB. Но когда я недавно использовал эту функцию, я столкнулся с неожиданной ошибкой. Когда я запускаю MWE ниже, я получаю ошибку Undefined function or variable 'a'. несмотря на функции доступны в том же файле. Когда я комментирую if заявление, ошибка исчезнет. Это, по-видимому, означает, что MATLAB предварительно интерпретирует a как переменная, даже если строка назначения переменной никогда не достигается, игнорируя тот факт, что существует функция с тем же именем. Это ошибка MATLAB или это как-то желаемое поведение?

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

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

где функция a (показано выше) сохраняется в свой файл.

при компиляции "a" было определено как переменная, и эта переменная неинициализированный. "a" также является именем функции, и предыдущие версии MATLAB назвали бы функция. Однако MATLAB 7 запрещает использование того же имени в том же контексте, что и функция и переменная.

это не столько ошибка, сколько двусмысленность, введенная схемой именования, которой был предоставлен метод разрешения по умолчанию, который может раздражать, если вы никогда не сталкивались с проблемой раньше, и m-lint не отмечает ее. Подобное поведение происходит, когда переменные переносятся в рабочую область без предварительной инициализации.

таким образом, решение состоит в том, чтобы изменить имя функции или переменной на разные вещи, что я бы сказал, что это хорошая практика в любом случае.

рассматривая ваш последующий пример, я заметил некоторое интересное поведение при перемещении вещей в функции. Во-первых, если функция является внешней или вложенной, вы получаете обсуждаемое поведение очень хорошо!-Ответ -24-->по Suever это. Однако, если функция локальна, вы можете обойти ограничение (по крайней мере, вы можете в моих установках R2014b и R2015a), вызвав функцию до преобразования ее в переменную, если вы инициализируете ее или явно преобразуете ее в переменную в какой-то момент. Проходя через дела, следующие органы matlabBugTest выполнить так:

Я не совсем уверен, почему это поведение так, но, по-видимому, парсер обрабатывает вещи по-разному в зависимости от объема функции и порядка появления символов и в каких контекстах.

поэтому, предполагая, что это поведение не изменило и не изменит вас можно попробовать что-то вроде:

хотя, совершенно личное мнение здесь, я бы сделал что-то вроде

Что касается нарушения "совместимости между функциями и скриптами/командной строкой", я действительно не вижу в этом проблемы, поскольку это два совершенно разных контекста, когда дело доходит до Matlab. Вы не можете определить именованную функцию в командной строке или в файле скрипта; поэтому нет никакой нагрузки на JIT Matlab для правильного и однозначно определите, является ли символ вызовом функции или переменной, поскольку каждая строка выполняется последовательно и не компилируется (помимо определенных блоков кода JIT предназначен для распознавания и оптимизации подобных циклов в скриптах). Теперь о том, почему вышеупомянутое жонглирование декларациями работает, я не совсем уверен, так как он полагается на JIT Matlab, о котором я ничего не знаю (и я не взял класс компилятора, поэтому я даже не мог бы сформировать академическую причину, если бы захотел).

причина, по которой вы получаете это поведение, вероятно, что Matlab никогда не реализовывал разрешение области для любого из своих операторов. Рассмотрим следующий код

это фактически отобразит "foo". С другой стороны,

дает ошибку неопределенная функция или переменная "a". Поэтому давайте рассмотрим следующее: пример,

TroyHaskin четко говорится в ответ

это связано с тем, как Matlab выполняет привязку имен во время компиляции. Поскольку matlabBugTest имеет строку, которая присваивает значение a, a определяется как переменная, а более поздняя строка с a является ссылкой на эту переменную, а не вызовом локальной функции

Matlab не поддерживает постоянные выражения и выполняет только ограниченный анализ статического кода. Фактически, если оператор if принимает аргумент false , или enterStatement является ложным, Matlab предоставляет предупреждение,это утверждение (и, возможно, следующие) не может быть достигнуто. Если enterStatement имеет значение false Matlab также генерирует другое предупреждение,переменная a используется, но может быть unset. Однако если enterStatement = mod(0,2) , так сказать, если enterStatement вызывает функцию, вы не получите никакого предупреждения вообще. Этот означает,что если пример в вопросе был разрешен, то (c, 2) будет компилироваться на основе того, как оценивалась функция, и это противоречие. Это означает, что код должен компилироваться на основе результатов выполнения.

Примечание: конечно, было бы хорошо, если бы Matlab мог генерировать ошибку в случае enterStatement было выражением вместо константы false , но возможно ли это или нет, это будет зависеть от реализации, я думаю.

Последний раз редактировалось GAA 13.04.2017, 18:07, всего редактировалось 2 раз(а).

Andrey_Kireew , а функция при помощи loadlibrary загружалась? Если таким способом, то что возвращает libfunctions ?

(И лучше сразу весь текст загрузки функции привести.)

Про loadlibrary ничего не слышал, думал запускать нужно так же как и .m функцию, просто из командной строки matlab.

Сейчас попробовал, что то заработало, выполняю команды:

>> hfile = fullfile('C:','Users','User','Documents','MATLAB','Q_filt.h');
>> loadlibrary('Q_filt',hfile)

смотрю какие функции загрузились

Functions in library Q_filt:

Q_filtInitialize mlfQ_filt
Q_filtInitializeWithHandlers mlxQ_filt
Q_filtPrintStackTrace
Q_filtTerminate

как запускать не пойму, пробовал так

>> out =calllib('Q_filt','Q_filtPrintStackTrace',x,3,1001,0.5);
Error using calllib
No method with matching signature.

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

В прежних версиях я просто компилировал C код с подключением библиотек MatLab'а из любого стандартного компилятора. работает пока.

Однако тема здесь об обратном.

Саму библиотеку я могу полностью написать на С++, но работать с ней хотелось бы в среде Matlab, так будет проще и намного быстрее исследовать алгоритм.

Где то в сети прочитал, что matlab запросто работает с dll и обращаться к ним можно как к обычным m - функциям. Теперь оказывается её сначала нужно загружать, а потом ещё как то запустить содержащуюся в ней функцию.

Последний раз редактировалось Geen 14.04.2017, 10:33, всего редактировалось 1 раз.

Саму библиотеку я могу полностью написать на С++, но работать с ней хотелось бы в среде Matlab, так будет проще и намного быстрее исследовать алгоритм.

Именно, Вы пишите критические блоки на C (C++) и вызываете их как функции из MatLab'а без всяких "подгрузок" (просто dll'ка должна содержать mexFunction, через которую и производится вызов)

Последний раз редактировалось GAA 15.04.2017, 10:39, всего редактировалось 5 раз(а).

Где то в сети прочитал, что matlab запросто работает с dll и обращаться к ним можно как к обычным m - функциям.

В старых версиях loadlibrary не было (но в R2013 уже есть). loadlibrary предназначена для преодоления ограничений стандартного способа вызова внешних функций (mex — Matlab EXternal). В простейших случаях в явной загрузке необходимости нет. Для старых версий описание на русском можно найти в книге Мартынов Н.Н., Иванов А.П. “Matlab 5.X. Вычисления, визуализация, программирование” (легко нагуглить электронную версию в сети).

[Upd] loadlibrary c 7-ой версии. [/Upd]

По теме. Andrey_Kireew , приведите детали. Иначе трудно угадать.

Последний раз редактировалось GAA 14.04.2017, 22:24, всего редактировалось 1 раз.
Исправлено форматирование цитаты

Именно, Вы пишите критические блоки на C (C++) и вызываете их как функции из MatLab'а без всяких "подгрузок" (просто dll'ка должна содержать mexFunction, через которую и производится вызов)

Да нет, Вы не поняли, я не писал блоки на С++, эта функция написана в matlab в виде m - файла. Там была всего одна функция Q_filt.m, откуда в библиотеке появилось несколько - пока понять не могу. Компиляция вся проводилась в среде матлаб, с помощью Matlab Comoiller. EXE файлы он создаёт запросто, но для .dll требует внешний компилятор. Я указал VC2010, т.к. у меня есть только он. Вообще есть все основания полагать, что при таком подходе всё необходимое для запуска в matlab должно создаваться само. Попробую ещё разок откомпилировать поменяв настройки.

За ссылку спасибо - почитаю. Но судя по всему там именно о том что вы говорите, т.е. о внешних файлах, написанных на С++. В перспективе конечно я думаю так и сделать, так как это позволит максимально оптимизировать код. Но пока мне хотелось бы скомпилировать m - функцию непосредственно, чтобы понять какой выигрыш даёт компиляция и на что можно рассчитывать.

Но пока мне хотелось бы скомпилировать m - функцию непосредственно

Перепишите (напишите) на C именно эту функцию - Вы наверняка сумеете написать её более оптимально чем "конвёртер" из m в C.

понять какой выигрыш даёт компиляция и на что можно рассчитывать.
Выигрыш может быть несколько порядков (зависит и от самой функции и от её использования).

Это будет не так быстро, а посмотреть хочется уже сейчас

я вот перекомпилировал с другим именем, и она вроде как стала работать

>> out =calllib('QF','mlxQ_filt',x,3,1001,0.5);
Error using calllib
Parameter must be scalar.

если вместо x ввожу число - она возвращает 0 и никаких ошибок, но x - это вектор и возвращать она должна вектор

при компиляции выдаётся предупреждение

>> warnings
warnings =
QF.h Type 'intvoidPtr__ptr64' was not found. Defaulting to type error. Found on line 11585 of input from line 290 of file C:\\Program Files (x86)\\Microsoft

может в этом дело?

Последний раз редактировалось GAA 15.04.2017, 12:57, всего редактировалось 12 раз(а).

1. В старых версиях Matlab можно было создать dll из командного окна.
Традиционный простейший пример. Matlab 6.5. Допустим в текущей директории имеется m-функция
Если «выбран» компилятор, то после ввода в командном окне
>> mcc -x MyAdd
в текущей директории будут созданы файлы: myadd.c, myadd.h, myadd_mex.c, MyAdd.dll
Теперь «для чистоты эксперимента» спрячем MyAdd.m (удалим или перенесём туда, где Matlab её не найдёт). Затем убедимся, что всё работает

(В прятанье нет необходимости: если при вызове функции в одной директории будет найден и m-файл, и dll, то выполнится функция из dll, в соответствии с написанным в Мартынове и Иванове.)

2. В новых версиях (в том числе R2013 64бит) в описанной вами задаче вместо dll используются бинарные mex-файлы. Компилировать из командного окна см. mex. Тогда вызов функции будет, как и в старых версиях (c mex-dll), просто по имени функции.

-- Пт 14.04.2017 21:59:10 --

Грубо говоря, бинарные mex — [ 64-битный ] аналог mex-dll старых версий.

Последний раз редактировалось GAA 15.04.2017, 01:06, всего редактировалось 2 раз(а).

Под 32-битной Windows расширение исполняемого mex файла - mexw32. Под 64-битной Windows - mexw64. Желательно проверить для конкретной версии, но скорее всего так и есть.

Последний раз редактировалось GAA 17.04.2017, 13:15, всего редактировалось 8 раз(а).

Компиляция вся проводилась в среде матлаб, с помощью Matlab Comoiller. EXE файлы он создаёт запросто, но для .dll требует внешний компилятор. Я указал VC2010, т.к. у меня есть только он.

Это не понятно. Вроде lcc идёт только с 32-битной версией (и это все равно внешний компилятор). С 64-битной он не идёт (и согласно сведениям на сайте MathWorks, и сам только что на одном из компьютеров проверил для R2013b 64bit). Скорее всего mcc просто использовал единственный доступный из совместимых компиляторов (или просто единственный доступный).
upd По поводу использования mcc компилятора. Тут возможно я не прав. И так было в старых версиях. upd

-- Сб 15.04.2017 10:08:06 --

Понятно, что работать не будет. :) На компе с R2013 (где я могу попробовать) деинсталлирован VC, поэтому содержательного ничего не скажу. Я бы попробовал исполняемый mex сделать из среды matlab и если ошибка повториться, то написать в тему - может найдутся участники с установленным VC.

(К слову, ни VC 2010 Redistributable, ни VC 2013 Redistributable в список поддерживаемых matlab компиляторов не входит и использовать его у меня не получилось.)

Последний раз редактировалось GAA 16.04.2017, 09:30, всего редактировалось 5 раз(а).
Исправлены опечатки

Да, я тоже хочу его сделать, но не получается.
Пришлите мне, пожалуйста, ссылку на какой-нибудь рабочий пример.
Из help matlab я ничего так и не понял (в смысле как компилировать в mex)

проходит нормально.
Кстати, тут написано, что VC 2010 Professional поддерживается (у меня RТMRel - тоже наверно должен работать)
SystemRequirements-Release2013a_SupportedCompilers.pdf

уже не работает, пишет, что не определён тип целевого приложения.

Опытным путём дошел вот до чего

>> mcc -win64 -W cpplib:QF -T link:lib -d C:\Users\User\Documents\MATLAB\QF\src C:\Users\User\Documents\MATLAB\Cardi\стат_тесты\Q_filt.m

И она работает: в папке C:\Users\User\Documents\MATLAB\QF\src появляются dll и всё остальное.

Может нужно просто что-то изменить в этой строке, чтобы появлялся mex - файл?

[Matlab] Операции с файлами в Matlab: fopen, fseek, fread, fclose и т. Д.

Работа с файлами - важный метод ввода и вывода, то есть чтение данных из файлов данных или запись результатов в файлы данных. MATLAB предоставляет ряд низкоуровневых функций ввода и вывода специально для файловых операций.

1. Открытие и закрытие файла

1) Откройте файл
Перед чтением и записью файла необходимо использовать функцию fopen, чтобы открыть или создать файл, и указать режим работы для файла. Формат вызова функции fopen:
fid = fopen (имя файла, «открытый метод»)
Примечание: fid используется для хранения значения дескриптора файла. Если возвращаемое значение дескриптора больше 0, файл открывается успешно. В имени файла используется строка символов, чтобы указать файл данных, который нужно открыть. Распространенные способы открытия следующие:
 ‘r’: откройте файл в режиме только для чтения (режим по умолчанию), файл должен уже существовать.
 ‘r +’: откройте файл в режиме чтения-записи, после открытия сначала прочтите, а затем запишите. Файл должен уже существовать.
 ‘w’: записывать данные после открытия. Файл обновляется, если он уже существует; если он не существует, он создается.
 ‘w +’: откройте файл в режиме чтения-записи. Сначала читайте, потом пишите. Файл обновляется, если он уже существует; если он не существует, он создается.
 ‘a’: добавить данные в конец открытого файла. Если файл не существует, он создается.
 ‘a +’: после открытия файла сначала считайте данные, а затем добавьте данные. Если файл не существует, он создается.
Кроме того, добавьте "t" после этих строк, например,'rt 'или'wt +', тогда файл будет открыт в текстовом режиме; если добавлен "b", то Открыть в двоичном формате, который также является методом открытия по умолчанию для функции fopen.

2) Закройте файл
Файл должен быть закрыт вовремя после операций чтения и записи, чтобы избежать потери данных. Используйте функцию fclose, чтобы закрыть файл. Формат вызова:
sta=fclose(fid)
Описание: эта функция закрывает файл, представленный fid. sta представляет собой код возврата операции закрытия файла. Если закрытие прошло успешно, возвращается 0, в противном случае - -1. Если вы хотите закрыть все открытые файлы, используйте fclose («все»).

2. Операции чтения и записи двоичных файлов.

1) Записывать двоичные файлы
Функция fwrite записывает элементы матрицы в файл в соответствии с указанной точностью данных. Формат звонка:
COUNT=fwrite(fid,A,precision)
Описание: COUNT возвращает количество записанных элементов данных (по умолчанию), fid - дескриптор файла, A используется для хранения данных, записанных в файл, precision представляет точность данных, обычно используется Точность данных включает: char, uchar, int, long, float, double и т. Д. По умолчанию точность данных равна uchar, то есть беззнаковому формату символов.
Пример 6.8 Сохранение двоичной матрицы в файл на диске.

a=[1 2 3 4 5 6 7 8 9];
fid = fopen (‘d: \ test.bin’, ‘wb’)% Откройте файл, записав двоичные данные
fid =
3%, значение которого больше 0, что означает успешное открытие

fwrite(fid,a,‘double’)
ans =
9% означает, что записано 9 данных.

fclose(fid)
ans =
0% означает, что выключение прошло успешно.

2) Читать двоичные файлы
Функция fread может считывать данные двоичного файла и сохранять их в матрице. Формат звонка:
[A,COUNT]=fread(fid,size,precision)
Описание: где A - матрица, используемая для хранения считанных данных, COUNT - количество возвращенных элементов данных, fid - дескриптор файла, а размер является необязательным. Если не выбран, Прочитать все содержимое файла; если этот параметр выбран, его значение может быть следующими: N (читать N элементов в вектор-столбец), inf (читать весь файл), [M, N] (читать данные в M × N Данные хранятся в столбцах). Precision используется для контроля точности записываемых данных, и его форма такая же, как у функции fwrite.

3. Операции чтения и записи текстовых файлов.
1) Прочитать текстовый файл
Функция fscanf может считывать содержимое текстового файла и сохранять его в матрице в соответствии с указанным форматом. Формат звонка:
[A,COUNT]=fscanf(fid,format,size)
Описание: A используется для хранения считанных данных, COUNT возвращает количество прочитанных элементов данных, fid - это дескриптор файла, формат используется для управления форматом считанных данных и% В сочетании с символами формата распространенными символами формата являются: d (целое число), f (с плавающей точкой), s (строка), c (символ) и т. Д. Вы также можете вставить дополнительные символы между% и символами формата. Спецификатор формата, например описание ширины данных. Размер не является обязательным, он определяет порядок данных в матрице A. Он может принимать следующие значения: N (чтение N элементов в вектор-столбец), inf (чтение всего файла), [M, N] (чтение данных в В матрице M × N данные хранятся в столбцах).

Использование fscanf в Matlab выглядит следующим образом:
A=fscanf(fid,format)
[A, count]=fscanf(fid,format,size)
[A, count]=fscanf(fid,format,size)

Лично наиболее часто используемая форма такова:
data = fscanf(fid,format,size);
, где данные - это массив прочитанного содержимого, а его размер определяется размером. size - вектор [mn], m - строка, n - столбец (обратите внимание, что здесь порядок чтения - сначала столбец, если вы не понимаете, вы можете увидеть пример ниже), если n - inf, это означает чтение до конца файла. . fid - это возвращаемое значение файла, открытого fopen, а format - это параметр форматирования (например, printf, scanf).

Приведи небольшой пример:
Путь + имя файла: d: \ moon.txt
Содержание: 13,1,3.4

Теперь, чтобы прочитать данные из moon.txt в массиве, вы можете использовать следующий метод:
fid=fopen(‘d:\moon.txt’);
data = fscanf (fid, ’% f,% f,% f’, [3, inf]);% используйте здесь одинарные кавычки
fclose(fid);

На данный момент данные в данных выглядят следующим образом: (3 строки и 4 столбца, элементы MATLAB расположены в порядке столбцов)

Обычно нам может потребоваться ссылка на определенную строку или определенный столбец в массиве, чтобы нарисовать изображение, метод - данные (m, :) или данные (:, n), то есть получить m-ю строку или n-й столбец массива данных.

2) Напишите текстовый файл
Функция fprintf может записывать данные в текстовый файл в указанном формате. Формат звонка:
fprintf(fid,format,A)
Описание: fid - это дескриптор файла, который указывает файл, в который будет выполняться запись. format - это символ формата, используемый для управления форматом записываемых данных, который аналогичен функции fscanf. A используется для хранения данных. матрица.
Пример 6.9. Создайте символьную матрицу и сохраните ее на диск, затем считайте и назначьте другой матрице.

matlab читает текстовый файл
fid=fopen(‘fx.txt’,‘r’);
% получить номер файла
[f,count]=fscanf(fid,’%f %f’,[12,90]);
% Прочитать данные файла номер 1 в f. Где f - матрица [12 90]
% Здесь ’% f% f’ представляет формат чтения данных, которые считываются как исходный тип данных.
fclose(fid);
% Закрыть файл

Кроме того, некоторые файлы txt можно открывать с помощью load
Предложение
f=load('fx.txt)
Я лично считаю, что первый способ лучше. Потому что иногда, особенно когда в одной строке fx.txt содержится несколько данных, использование load более проблематично.

4. Расположение файла данных
MATLAB предоставляет функции fseek и ftell, связанные с операциями позиционирования файлов. Функция fseek используется для определения местоположения указателя позиции файла, и ее формат вызова:
status=fseek(fid, offset, origin)
, где fid - дескриптор файла, смещение представляет количество байтов, перемещаемых указателем позиции, а значения OFFSET интерпретируются следующим образом:

0 Move toward the end of the file.
= 0 Do not change position.
< 0 Move toward the beginning of the file.
origin представляет исходную позицию перемещения указателя позиции, значения ORIGIN интерпретируются следующим образом:
‘bof’ or -1 Beginning of file
‘cof’ or 0 Current position in file
‘eof’ or 1 End of file。
Если позиционирование выполнено успешно, возвращаемое значение статуса - 0, в противном случае возвращаемое значение - –1.

Функция ftell возвращает текущую позицию указателя файла, и ее формат вызова:
position=ftell (fid)
Возвращаемое значение - это количество байтов от начала файла до текущей позиции указателя. Если возвращаемое значение равно –1, это означает, что текущая позиция файла не может быть получена.
Пример:
FID=fopen(‘sw.m’,‘r’)
fseek(FID,10,-1)
ans =
0

ftell(FID)
ans =
2180
Указатель файла можно переместить за конец текущего файла, но не перед его началом; когда указатель перемещается за конец файла, если файл закрыт, размер файла автоматически увеличивается до размера файла. Размер, указанный указателем, позволяет легко создать большой файл с помощью этого метода, конечно, содержимое нового добавленного файла является случайным.

[Приложение: Matlab читает исходный код файлов формата grd]
clc;
clear all;
close all;
fid=fopen([‘C:\Zhenghui_Code\testDLL\testForDLL\kms04ssh-egm96u.grd’],‘r’);

head = fread (fid, 4, ‘uint8 => char’) ’;% Прочтите заголовок файла DSAA
fscanf(fid,’\n’);

nx = fscanf (fid, ’% d’, 1);% прочитано количество строк данных сетки nnx, количество столбцов nnz
fp = fseek (fid, 1,0);% 1 означает, что указатель прочитанного файла сдвигается назад на 1 бит, а 0 означает, что указатель перемещается относительно текущей позиции
ny=fscanf(fid,’%d’,1);
fscanf(fid,’\n’);

xmin = fscanf (fid, ’% f’, 1);% считывает минимальное и максимальное значения x
fseek (fid, 4,1);% 4 означает, что указатель прочитанного файла сдвинут назад на 4 бита, 1 означает, что ссылочная позиция перемещения указателя является концом файла
xmax=fscanf(fid,’%f’,1);
fscanf(fid,’\n’);

ymin = fscanf (fid, ’% f’, 1);% считывает минимальное и максимальное значения y
fseek(fid,4,1);
ymax=fscanf(fid,’%f’,1);
fscanf(fid,’\n’);

zmin = fscanf (fid, ’% f’, 1);% считывает минимальное и максимальное значения z
fseek(fid,4,1);
zmax=fscanf(fid,’%f’,1);
fscanf(fid,’\n’);

for i = 1: ny% Обратите внимание, что Matlab хранит данные в порядке столбцов, сначала столбец 1, затем столбец 2, а затем последний столбец.
for m=1:nx
vp(i,m)=fscanf(fid,’%f’,1);
fseek(fid,4,1);
end
fscanf(fid,’\n’);
end

Читайте также: