请原谅我,如果这很容易解决,但是,我在MATLAB中有一个包含距离值的上三角矩阵。 假设对于每个第i和第j值分别存在行标签和列标签(考虑到矩阵分别包含每个对应行和元素的{i,j}值)。 我想创建一个如下所示的文本文件:
Label-i val Label-j
其中i和j是各自的列标签。这非常简单,使用2 for循环迭代所有元素。
[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
但是,我想知道有什么更快的方法来做同样的事情。我之前在论坛上看过类似的帖子,但是,与此不完全相关。如果有人能给我一些见解,那就太好了。我看到了可以使用的arrayfun和其他MATLAB函数,但是,在这种情况下,我无法弄清楚如何使用它们。 谢谢您的帮助。
答案 0 :(得分:3)
Meshgrid将为您提供所有行x col组合。
[XX,YY] = meshgrid(collabels,rowlabels);
mat = [XX(:) A(:) YY(:)];
答案 1 :(得分: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
答案 2 :(得分:1)
没有循环的一种方法是:
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