在不使用'for'循环的情况下访问MATLAB中矩阵的所有元素

时间:2015-08-06 03:22:21

标签: matlab matrix

请原谅我,如果这很容易解决,但是,我在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函数,但是,在这种情况下,我无法弄清楚如何使用它们。 谢谢您的帮助。

3 个答案:

答案 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