Вибачте, якщо це легко вирішити, але я, ямати верхньотрижневу матрицю в MATLAB, що містить значення відстані. Припустимо, що для кожного i-го та j-го значень є відповідні ярлики рядків та ярлики стовпців (матриця містить значення {i, j} відповідно для кожного відповідного рядка та елементів відповідно). Я хочу створити текстовий файл, який виглядає так:
Label-i val Label-j
де i та j - відповідні значки стовпців. Це досить прямо вперед, використовуючи 2 для циклів для перебору всіх елементів.
[r,~] = size(A);
mat = [];
for i = 1:r
for j = 1:r
tmpmat = [collabels(i) A(i,j) rowlabels(j)];
mat = [mat;tmpmat];
end
end
Але я хочу знати, які швидші способи існуютьтак само. Я бачив аналогічні повідомлення на форумі раніше, але не точно стосовно цього. Якщо хто-небудь може дати мені певне уявлення про це, це буде чудово. Я бачив функції матриці та інші MATLAB, які можна використовувати, але я не міг розібратися в тому, як використовувати їх у цьому випадку. Дякую за допомогу.
Відповіді:
3 для відповіді № 1Meshgrid дасть вам всі комбінації рядків x col.
[XX,YY] = meshgrid(collabels,rowlabels);
mat = [XX(:) A(:) YY(:)];
2 для відповіді № 2
Якщо ви використовуєте матрицю з "віддаленими значеннями", ви повинні використовувати sparse
матриця Оцінка рідкісної матриці дасть вам координати та значення безпосередньо, тому я б запропонував просто зберегти вихід безпосередньо у файл. Ось приклад:
% Create sparse matrix
A = sparse(10,10);
A(5,5) = 1;
A(2,2) = 1;
% Save the disp() output into a string
A_str = evalc("disp(A)");
% Write this string to a file
fid = fopen("test.txt", "wt");
fprintf(fid,"%s",A_str);
Вихід у файл test.txt
буде:
(2,2) 1
(5,5) 1
1 для відповіді № 3
Один із способів зробити це без петлі є:
A = randi(100, 2, 3);
collabels = [0, 1, 2];
rowlabels = [3, 4];
[m, n] = size(A);
B = repmat(collabels, m, 1);
B = B(:)";
C = repmat(rowlabels, 1, n);
tmpmat = [B; A(:)" ; C];
mat = tmpmat(:);
Вихід:
A =
14 11 50
73 66 78
mat =
0 14 3
0 73 4
1 11 3
1 66 4
2 50 3
2 78 4