【问题标题】:Insert array columns iteratively in MATLAB在 MATLAB 中迭代地插入数组列
【发布时间】:2012-06-09 09:59:47
【问题描述】:

我正在尝试通过在 for 循环中在该数组上附加单个列来构造一个数组。我这样做是通过首先初始化一列零并将我读取的每个新列放在更新向量的右侧。但不幸的是,这部分有效,并且仅在进行限制之后才有效,即仅保留每个新向量的第一行 - 例如 - 500 行。

关于下面这个问题的解决方案,首先我不明白为什么这个零列向量没有出现在最后一个数组中!另一个问题是,即使我从一开始就知道最终数组的总列数,在某些情况下我也不知道单独列的实际行数。实际上,我想考虑作为最终数组中的默认行数,要附加的不同单列之间的行数越大,所以我认为,最好的做法应该是运行整个列数决定更大的行数,然后设置初始数组的适当维度以由单列数据填充,最后根据后者填充第一个。

任何建议都将受到高度赞赏!

data = zeros(500,1);
for symbol = 1:length(symbol_list),
    [hist_data] = retrieve_data(symbol_list(symbol));
    data = [data hist_data(1:500)];
end

编辑:

让我给你一个输入/输出的例子:

我想放置以下三列(我在每次迭代中检索其中一列)

0.402513860949959   0.401546899405730   0.405949059210334
0.401396441661866   0.400288848738267   0.403936753893693
0.400862023741474   0.402233108860710   0.404473368644797
0.411161714570851   0.413612748989126   0.409437055092511
0                   0.414870799656589   0.415071509979105
0                   0.416586323294039   0

一个接一个,最后得到下表(只保留行数较大但行数相同的表格 - 因此,我只保留第二列):

0.401546899405730
0.400288848738267
0.402233108860710
0.413612748989126
0.414870799656589
0.416586323294039

换句话说,我有很多列,我想一个接一个地附加。它们中的大多数具有非常大的行长度,这是相同的。但是,其他一些具有任意较小的行数(长度)。我什么是找到这个“大”行数,只保留与这个“大”长度相对应的列,最后将一个放在另一个旁边。

【问题讨论】:

    标签: arrays matlab


    【解决方案1】:

    我认为您最好使用元胞数组来存储从retrieve_data 获得的数据,因为您正在处理具有不同行数的列。将所有内容收集到一个元胞数组中后,您仍然可以通过填充较短的行或修剪较长的行来转换为标准矩阵。

    c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'}
    sizesC = cellfun(@length,c)
    % pad to maximal size with Nan's
    for el=1:length(c)
        c{el}(sizesC(el)+1:max(sizesC))=NaN;
    end
    % Trim to minimal size
    c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'}
    for el=1:length(c)
        c{el}(min(sizesC)+1:end)=[];
    end
    % Convert rectangular cellarray to matrix
    m=cell2mat(c)
    

    【讨论】:

      【解决方案2】:

      我不确定我是否遵循了您的大部分问题,因此这可能不是您所提问题的答案...

      如果您尝试构建的数据结构不是真正的数组,例如,如果它真的是长度不等的向量列表,那么普通的旧数组可能不是在 Matlab 中使用的最佳数据结构。这可能是实际的选择,但cell array 可能是更好的选择。

      如果数组是正确或实用的选择,那么大多数有经验的 Matlab 用户通常认为通过在每次循环中添加一个新列来构建它是一个非常糟糕的想法。以这种方式构建数组在时间上可能非常昂贵,并且还可能导致内存问题。无论如何,这是一般的想法,没有人会强迫你遵循这个想法。

      更好的方法是将数组分配为大块。在理想的 (?) 情况下,您将使用诸如

      之类的语句一次性分配整个数组
      data = zeros(500,462);
      

      然后将数据写入循环内的每一列。如果您不知道最终需要的列数,请创建一个可能足够大的数组;如果你用完了空间,一次添加N列,继续循环。必要时重复。 N 的一个好的选择很大程度上取决于您的问题和您的数据。

      逐列(或逐行)构建(大)数组的原因是,每当您添加新列时,Matlab:

      1. 为新的更大的数组获取足够的空闲内存;
      2. 将值从旧内存位置复制到新位置;
      3. 将存储旧版本数组的内存块返回到空闲内存池(或 Matlab 实际调用的任何内存池)

      重复执行此操作可能需要很长时间。它还可能导致过多的内存碎片,返回到池中的内存块都不会大到足以用于同一数组的更高版本;如果你的内存使用模式错误,你最终会发现被释放的块占用的内存对于任何新数组来说都太小了,但是对于这里和那里的奇数标量来说,你需要的内存太多了。这更多的是概率而非确定性,但在将数据塞入框中的每个字节时值得牢记。

      【讨论】:

        猜你喜欢
        • 2014-01-03
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        • 2018-01-12
        相关资源
        最近更新 更多