Как заново создать матрицу из индексов и значений из текстового файла Froma в Matlab - PullRequest
2 голосов
/ 22 мая 2011

Я хочу сделать следующее в Matlab: -У меня есть текстовый файл в следующем формате: 1 1 0,242 1 2 0,332 ... 75 74 0,485 75 75 0,726 -Первый столбец - это список i-го индекса матрицы, второй столбец - это j-й индекс матрицы, а третий столбец - это значение по определенному индексу (i, j). Короче говоря, у меня есть матрица 75x75 со своими значениями в текстовом файле. -Я хочу прочитать эти данные и воссоздать матрицу в Matlab, чтобы я мог выполнять операции с ней. Есть предложения?

Ответы [ 4 ]

3 голосов
/ 22 мая 2011

То, что вы описываете, является файлом, хранящим разреженную матрицу (в формате кортежей).Разреженная матрица - это матрица, в которой большинство элементов равно 0, поэтому для экономии места необходимо хранить только ненулевые элементы.Matlab имеет встроенный объект разреженной матрицы.Вы можете загрузить свой файл напрямую:

>> load matrix.mtl;
>> A = spconvert(matrix);

см .: http://bebop.cs.berkeley.edu/smc/formats/matlab.html

Еще одна вещь, о которой вы могли бы знать, - это функция sparse, которая принимает три вектора и превращает их вразреженная матрица.

Разреженная матрица может быть преобразована в плотную матрицу (т. е. двумерный массив, что большинство людей имеют в виду, когда говорят матрицу): full(A)

1 голос
/ 23 мая 2011

Чтобы воссоздать полную матрицу 75 на 75 в MATLAB, вы можете сначала загрузить свой файл, используя функцию LOAD :

data = load('datafile.txt','-ascii');

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

mat = zeros(75);  %# Initialize your matrix to zeroes
mat(sub2ind([75 75],data(:,1),data(:,2))) = data(:,3);  %# Use SUB2IND...
%# ... or...
mat(75.*(data(:,2)-1)+data(:,1)) = data(:,3);  %# ... convert them yourself.
0 голосов
/ 23 мая 2011

Предполагая, что ваш файл называется «data.txt» и он содержит только отформатированную информацию, как вы упомянули, я думаю, что лучший способ сделать это, это пример кода:

fid=fopen('data.txt','r');
data=fscanf(fid,'%g',[3 Inf]);
fclose(fid);
[m n]=size(data);
a=zeros(75,75);
for i=1:n
    a(data(1,i),data(2,i))=data(3,i);
end

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

data =
1.0000    1.0000   75.0000   75.0000
1.0000    2.0000   74.0000   75.0000
0.2420    0.3320    0.4850    0.7260

Сообщите нам, если есть другие проблемы.Удачи;)

0 голосов
/ 22 мая 2011

Это зависит от того, хотите ли вы сделать это интерактивно или программно.

Интерактивное:

Импорт текстового файла с помощью мастера. Вы получите матрицу значений nx3 (скажем, data). Затем с помощью простого цикла for поместите все значения в нужное место.

A = zeros(75, 75);
for idx = 1:size(data, 1)
    A(data(idx, 1), data(idx, 2)) = data(idx, 3);
end

Программный:

Выполните импорт файла программно, используя, например, textscan. Затем действуйте, как указано выше.

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