/ / Доступ до всіх елементів матриці в MATLAB без використання циклів "for" - matlab, matrix

Доступ до всіх елементів матриці в MATLAB без використання циклів "for" - matlab, matrix

Вибачте, якщо це легко вирішити, але я, ямати верхньотрижневу матрицю в 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 для відповіді № 1

Meshgrid дасть вам всі комбінації рядків 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