【问题标题】:How to save indices and values from Matrix in Matlab?如何在 Matlab 中保存矩阵中的索引和值?
【发布时间】:2016-06-25 17:57:27
【问题描述】:

我有一个 3x3 矩阵,想将索引和值保存到一个新的 9x3 矩阵中。例如A = [1 2 3 ; 4 5 6 ; 7 8 9] 这样我将得到一个矩阵x = [1 1 1; 1 2 2; 1 3 3; 2 1 4; 2 2 5; ...] 使用我的代码我只能存储最后一个值x = [3 3 9]

A = [1 2 3 ; 4 5 6 ; 7 8 9]; 
x=[];
 for i = 1:size(A)
   for j = 1:size(A)
      x =[i j A(i,j)]
   end
 end

感谢您的帮助

【问题讨论】:

  • 你需要迭代x
  • 对不起,你到底是什么意思?

标签: matlab matrix


【解决方案1】:

矢量化方法

这是一种避免循环的方法:

A = [1 2 3 ; 4 5 6 ; 7 8 9];
[ii, jj] = ndgrid(1:size(A,1), 1:size(A,2)); % row and column indices
vv = A.'; % values. Transpose because column changes first in the result, then row
x = [jj(:) ii(:) vv(:)]; % result

使用您的代码

您只是缺少与以前的 x 的串联:

A = [1 2 3 ; 4 5 6 ; 7 8 9];
x = [];
for i = 1:size(A)
  for j = 1:size(A)
    x = [x; i j A(i,j)]; % concatenate new row to previous x
  end
end

另外两个建议:

  • 不要将ij 用作variable names,因为这会影响虚数单位。
  • Preallocate x 而不是让它在每次迭代中增长,以提高速度。

修改后的代码为:

A = [1 2 3 ; 4 5 6 ; 7 8 9];
x = NaN(numel(A),3); % preallocate
n = 0;
for ii = 1:size(A)
  for jj = 1:size(A)
    n = n + 1; % update row counter
    x(n,:) = [ii jj A(ii,jj)]; % fill row n
  end
end

【讨论】:

    【解决方案2】:

    我开发了一个运行速度更快的解决方案。代码如下:

    % Generate subscripts from linear index
    [i, j] = ind2sub(size(A),1:numel(A));
    
    % Just concatenate subscripts and values
    x = [i' j' A(:)];
    

    试试看告诉我 ;)

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多