Напишите матрицу в определенном формате в текстовый файл из Matlab

Я имею эту разреженную матрицу размера, скажем, N x M

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

186 0:1 1:34 2:234 ...
123 0:23 2:23 6:303

Где 186 означает количество ненулевых элементов в первой строке. 0 представляет первый столбец и соответствующее ему значение 1. За этим следует значение первого столбца 34 для первой строки и так далее.

Аналогично для второй строки 123 представляет собой число ненулевых значений. 0 представляет собой первый столбец и его соответствующее значение 23 и т.д.

Как я могу сделать это эффективно в Matlab?

1 ответ

Используйте команду find для получения индексов и значений разреженной матрицы. Если вы сделаете это на транспонированной матрице, получившиеся индексы будут упорядочены по номеру строки, и вы можете легко записать их в файл:

%// get the nonzero indices and values of matrix A
[jj, ii, val]=find(A.');

%// find the number of nonzeros in each row:
n_nonzero=full(sum(A~=0,2));

%// write to output file
fid = fopen('filename.txt','w');
counter=1;
for rownum=1:size(A,1)
 %// write number of nonzero elements
 fprintf(fid,'%d',n_nonzero(rownum));

 %// write array indices and values
 %// assumes integer values for the array (as in your example)
 I = counter:counter+n_nonzero(rownum)-1;
 fprintf(fid,' %d:%d',[jj(I) val(I)]');
 fprintf(fid,'\n'); %// new line

 %// increment counter
 counter = counter + n_nonzero(rownum);
end
fclose(fid);

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

licensed under cc by-sa 3.0 with attribution.