【问题标题】:Matlab: Efficient way of inserting a row into a large matrixMatlab:将行插入大矩阵的有效方法
【发布时间】:2018-01-07 03:43:59
【问题描述】:

我正在处理生成和修改一个大小为 [10^6,8] 的相当大的矩阵。每次在矩阵的预定位置调用该算法时,都需要插入一个新行。我的问题是哪种方法是最节省内存/最快的方法?谢谢。

【问题讨论】:

  • 请添加一些代码。你想在矩阵的哪里添加新行?在它的开头或结尾。
  • 它可以在任何地方,很可能在某个地方;不是在最开始也不是在最后。
  • 首先,您最好将示例代码附加到问题中以阐明您的问题。关于最快的方法,基本和第一种方法是使用 Preallocation 。除了预分配,也许你还可以使用向量化计算等其他方法,但如果不分析你的代码,我不能肯定地说。
  • 主要算法很复杂。我认为没有必要添加附加它。在这里,只需考虑一个大矩阵,无论您喜欢什么,都需要将新行添加到矩阵中。对于这个矩阵,预分配不是这里的情况。
  • 抱歉,只有一种方法可以在矩阵中插入一行,那就是cat(即[])。它不漂亮。我建议你想一个更好的方法来实现你的算法。或者,如果您现在存储数据的方式太慢,则将数据存储为行向量元胞数组。

标签: matlab matrix insert row memory-efficient


【解决方案1】:

在矩阵中插入一行的基本方法是将矩阵分成两部分,一部分在插入偏移之前,另一部分在插入偏移之后。完成后,您所要做的就是组装一个新矩阵为[part1 row part2]

这是一个例子:

matrix = [
  1 1;
  2 2;
  3 3;
  4 4;
  5 5
]; 

row_to_insert = [100 100];

for insertion_offset = 0:size(matrix,1)
    disp([
      matrix(1:insertion_offset,:);
      row_to_insert;
      matrix(insertion_offset+1:end,:)
    ]);
end

这将输出:

   100   100
     1     1
     2     2
     3     3
     4     4
     5     5

     1     1
   100   100
     2     2
     3     3
     4     4
     5     5

     1     1
     2     2
   100   100
     3     3
     4     4
     5     5

     1     1
     2     2
     3     3
   100   100
     4     4
     5     5

     1     1
     2     2
     3     3
     4     4
   100   100
     5     5

     1     1
     2     2
     3     3
     4     4
     5     5
   100   100

但是,如果可以的话,请考虑使用不同的数据存储方法,处理如此庞大的矩阵总是很困难,无论您的算法表现如何。

【讨论】:

  • 在末尾/开头插入行然后更改矩阵的索引以将新行放置在它所属的位置不是更好吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-08
  • 2012-11-11
  • 2016-01-26
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多