【问题标题】:Accessing all elements of a matrix in MATLAB without using 'for' loops在不使用“for”循环的情况下访问 MATLAB 中矩阵的所有元素
【发布时间】:2015-08-06 03:22:21
【问题描述】:

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

【问题讨论】:

  • 文本文件中的行必须按特定顺序排列吗?例如,您的代码当前会遍历某一行的所有列,然后再移动到下一行。这必须保持真实吗?
  • 没有。只要它处理每个 i 和 j 的所有值。

标签: matlab matrix


【解决方案1】:

Meshgrid 将为您提供所有 row x col 组合。

[XX,YY] = meshgrid(collabels,rowlabels);
mat = [XX(:) A(:) YY(:)];

【讨论】:

  • 这是一个非常优雅的解决方案,谢谢!
【解决方案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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2014-11-11
      • 2020-05-12
      • 1970-01-01
      • 2014-05-01
      • 2013-02-16
      • 2023-03-06
      相关资源
      最近更新 更多