Загрузить значения из текстового файла в MATLAB - PullRequest
2 голосов
/ 30 марта 2009

Я хотел бы загрузить переменные из текстового файла.

Например, мой текстовый файл, varA, varB и varC.

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

Таким образом, из текстового файла, содержащего вышеуказанную информацию, я получил бы матрицу, которая выглядит следующим образом:

[ 1 2 3 4 5 6;
  1 2 3 4 5 6]

Возможно ли это?

Я добавил второй пример, чтобы попытаться прояснить ситуацию.

Мой текстовый файл text.txt выглядит следующим образом

x1 x2 x3

В MATLAB мой .m-файл дает значения этих переменных, такие как

x1 = [1 1; 1 1]
x2 = [2 2; 2 2]
x3 = [3 3; 3 3]

Итак, когда я импортирую свой текстовый файл, я получу

a = (textfile)
a = [1 1 2 2 3 3 ; 1 1 2 2 3 3]

Я в основном пытаюсь адаптировать генетический алгоритм (GA) к очень большой проблеме (типа задачи коммивояжера (TSP)). Проблема в том, что каждая моя переменная является матрицей, а коды кроссовера, фитнеса и мутации становятся довольно сложными. И у меня тоже проблемы со случайным начальным населением.

Я хотел бы выбрать случайным образом, скажем, 30 переменных, из списка с 256, чтобы переменная могла быть выбрана только один раз. Однако каждая переменная имеет свои конкретные значения в матрице 2 * 2, которые нельзя изменить.

Я хотел бы использовать randperm и затем ставить x перед каждым значением, делая их переменными вместо значений ...

1 Ответ

6 голосов
/ 30 марта 2009

Если данные в текстовом файле выглядят так (строки, разделенные пробелами):

x1 x2 x3 ...

Вы можете прочитать строки в массив ячеек, используя TEXTSCAN примерно так:

fid = fopen('file.txt','r');
A = textscan(fid,'%s');
fclose(fid);
A = A{:};

A теперь сохраняет строки в массиве ячеек: {'x1'; «Х2»; 'X3'; ...} . Теперь, чтобы сделать переменную из одной из этих строк и присвоить ей значение, я бы использовал ASSIGNIN :

assignin('base',A{1},[1 2; 1 2]);

Это создаст переменную x1 в базовой рабочей области и присвоит ей значение [1 2; 1 2] . Первый аргумент может быть либо «базовым», либо «вызывающим» для создания переменной либо в базовом рабочем пространстве MATLAB, либо в рабочем пространстве функции вызывающего. Вы должны повторить это для каждого имени строки в A , присвоив ему любое значение.


ДОПОЛНИТЕЛЬНЫЙ ВАРИАНТ:

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

Если я понимаю вашу проблему, у вас в основном 256 матриц 2 на 2, и вы хотите случайным образом выбрать 30 из них. Каждая из этих матриц 2 на 2 звучит так, как будто она хранится в своей собственной переменной ( x1 до x256 ). Вместо этого я бы предложил хранить все 256 матриц в одной переменной в виде трехмерного массива:

xArray = zeros(2,2,256);     % Initialize all matrices as [0 0; 0 0]
xArray(:,:,1) = [1 1; 2 2];  % This enters a value for the first matrix

или массив ячеек:

xArray = cell(1,256);    % Initializes an empty array of cells
xArray{1} = [1 1; 2 2];  % Enters a value for the first matrix

Сначала вам нужно будет инициализировать все значения. Затем, если вы хотите случайным образом выбрать 30 значений, вы можете затем рандомизировать порядок третьего измерения массива 3-D или порядка массива ячеек, используя RANDPERM :

startOrder = 1:256;              % The default order of the matrices
index = randperm(256);           % Randomly order the numbers 1 to 256
xArray = xArray(:,:,index);      % For a 3-d array
xArray = xArray(index);          % For a cell array

Затем просто используйте первые 30 записей в xArray для своих расчетов (вместо отдельных переменных, как вы были раньше):

x = xArray(:,:,1);  % Puts the first matrix from the 3-D array in x
x = xArray{1};      % Puts the first matrix from the cell array in x

Вы можете продолжать повторять использование RANDPERM для генерации новых рандомизированных массивов матриц. Если вам необходимо отслеживать, какие исходные матрицы вы используете, вы должны добавить эту строку после рандомизации xArray :

startOrder = startOrder(index);

Теперь записи startOrder сообщат вам исходную позицию, в которой была матрица. Например, если первая запись массива в startOrder равна 40, то матрица в первой позиция xArray изначально была 40-й матрицей, введенной вами при инициализации xArray .

Надеюсь, это поможет!

...